Warum benutzt ihr eigtl. immer dieses lahme WMI wenn es auch über die WinAPI geht?
-> GetAdaptersInfo function
-> IP_ADAPTER_INFO structure
Sollte ja als Tipp reichen und für den einen oder anderen nicht so schwer sein umzusetzen
Warum benutzt ihr eigtl. immer dieses lahme WMI wenn es auch über die WinAPI geht?
-> GetAdaptersInfo function
-> IP_ADAPTER_INFO structure
Sollte ja als Tipp reichen und für den einen oder anderen nicht so schwer sein umzusetzen
Auf der Windows API Index Seite wird uns ja nahegelegt:
Zitat von msdnDeprecated or legacy APIs
The following are technologies and APIs that are outdated or have been replaced or deprecated from the Windows client and server operating systems.- Graphics Device Interface (GDI): Use Direct2D instead.
- GDI+: Use Direct2D instead.
Habt ihr das mal mit Direct2D probiert?
Was man aber noch machen kann um es ein bisschen zu beschleunigen, ist neben LoadLibrary auch GetModuleHandle und GetProcAdress zu benutzen, um die ganzen Funktionen ein bisschen schneller aufrufen zu können.
Global $TimerObjCreate = TimerInit()
Global $AList = ObjCreate("System.Collections.ArrayList")
ConsoleWrite("Initialization Time : " & TimerDiff($TimerObjCreate) & @CRLF)
Global $TimerFirstAdd = TimerInit()
$AList.add("Some Data")
ConsoleWrite("First Write Time : " & TimerDiff($TimerFirstAdd) & @CRLF)
Global $TimerSecondAdd = TimerInit()
$AList.add("Some other Data")
ConsoleWrite("Second Write Time : " & TimerDiff($TimerSecondAdd) & @CRLF)
Global $TimerThirdAdd = TimerInit()
$AList.add("Some more Data")
ConsoleWrite("Third Write Time : " & TimerDiff($TimerThirdAdd) & @CRLF)
Alles anzeigen
Initialization Time : 12.3057350945263
First Write Time : 1.58978499292244
Second Write Time : 0.0186291191761843
Third Write Time : 0.0135211348859402
=============================================================================================
Habs auch mal mit AutoHotkey probiert:
#NoEnv
SetBatchLines -1
global TIMER_INIT := TIMER_ARR_1 := TIMER_ARR_2 := TIMER_ARR_3 := 0
QPC(1)
ArrList := ComObjCreate("System.Collections.ArrayList")
TIMER_INIT := QPC(0)
QPC(1)
ArrList.Add("Some Data")
TIMER_ARR_1 := QPC(0)
QPC(1)
ArrList.Add("Some other Data")
TIMER_ARR_2 := QPC(0)
QPC(1)
ArrList.Add("Some more Data")
TIMER_ARR_3 := QPC(0)
MsgBox % TIMER_INIT "`n" TIMER_ARR_1 "`n" TIMER_ARR_2 "`n" TIMER_ARR_3
QPC(R := 0)
{
static P := 0, F := 0, Q := DllCall("QueryPerformanceFrequency", "Int64P", F)
return !DllCall("QueryPerformanceCounter", "Int64P", Q) + (R ? (P := Q) / F : (Q - P) / F)
}
Alles anzeigen
Initialization Time : 10.9521
First Write Time : 0.3085
Second Write Time : 0.0036
Third Write Time : 0.0020
Erstelle ich das Array aber auf normalem Wege (ohne System.Collections.ArrayList) sieht es ganz normal aus
#NoEnv
SetBatchLines -1
global TIMER_INIT := TIMER_ARR_1 := TIMER_ARR_2 := TIMER_ARR_3 := 0
QPC(1)
ArrList := []
TIMER_INIT := QPC(0)
QPC(1)
ArrList.Push("Some Data")
TIMER_ARR_1 := QPC(0)
QPC(1)
ArrList.Push("Some other Data")
TIMER_ARR_2 := QPC(0)
QPC(1)
ArrList.Push("Some more Data")
TIMER_ARR_3 := QPC(0)
MsgBox % TIMER_INIT "`n" TIMER_ARR_1 "`n" TIMER_ARR_2 "`n" TIMER_ARR_3
QPC(R := 0)
{
static P := 0, F := 0, Q := DllCall("QueryPerformanceFrequency", "Int64P", F)
return !DllCall("QueryPerformanceCounter", "Int64P", Q) + (R ? (P := Q) / F : (Q - P) / F)
}
Alles anzeigen
Oder mit der WinAPI InternetGetConnectedState
Herunterfahren über:
Windows Icon => Rechtsklick => Herunterfahren oder abmelden => Herunterfahren
Ich fahre mein PC jeden Tag hoch und runter =)
06.09.2016 - 08:22 hier. Wusste gar nicht, dass mein PC erst in der Zukunft startet (08.10.2016 - 08:43)
selbst wmic os get lastbootuptime & net statistics workstation gibt bei mir dieses merkwürdiges Datum zurück
windows 10 halt...
Zu Befehl
Im Anhang:
- Runde_3.ahk
- Runde_3_x64.exe
- Runde_3_x86.exe
Bin mal so frei, eine andere Scriptsprache für das Bsp. #3 hinzuzufügen. Aber bitte nicht Steinigen
#NoEnv
#SingleInstance Force
SetBatchLines -1
global hToken := hCanvas := hPen := X1 := X2 := Y1 := Y2 := CountStart := CountEnd := 0
global GuiW := 1000, GuiH := 600, Rounds := 20000, GuiTitle := "GDI+ Performance Test"
global Q := DllCall("QueryPerformanceFrequency", "int64*", Frequency)
; ===============================================================================================================================
if !(DllCall("GetModuleHandle", "str", "GdiPlus", "ptr"))
hGDIPLUS := DllCall("LoadLibrary", "str", "GdiPlus.dll", "ptr")
VarSetCapacity(SI, 24, 0), Numput(1, SI, 0, "Int")
if !(DllCall("GdiPlus.dll\GdiplusStartup", "ptr*", hToken, "ptr", &SI, "ptr", 0))
hToken := hToken
; ===============================================================================================================================
Gui, +LastFound +hwndGDIExample
Gui, Show, % "w" GuiW " h" GuiH, % GuiTitle
DllCall("GdiPlus.dll\GdipCreateFromHWND", "ptr", GDIExample, "ptr*", hCanvas)
DllCall("Gdiplus.dll\GdipSetSmoothingMode", "ptr", hCanvas, "uint", 4)
DllCall("Gdiplus.dll\GdipCreatePen1", "uint", 0xFFFFFFFF, "float", 1, "int", 2, "ptr*", hPen)
DllCall("GdiPlus.dll\GdipGraphicsClear", "ptr", hCanvas, "uint", 0xFF000000)
DllCall("QueryPerformanceCounter", "int64*", CountStart)
loop % Rounds
{
X1 := FRandom() * GuiW, X2 := FRandom() * GuiW, Y1 := FRandom() * GuiH, Y2 := FRandom() * GuiH
, DllCall("GdiPlus.dll\GdipSetPenColor", "ptr", hPen, "uint", 0xFF000000 + IRandom())
, DllCall("GdiPlus.dll\GdipDrawLine", "ptr", hCanvas, "ptr", hPen, "float", X1, "float", Y1, "float", X2, "float", Y2)
}
DllCall("QueryPerformanceCounter", "int64*", CountEnd)
WinSetTitle, % GuiTitle " / Created " Rounds " lines in " Round((CountEnd - CountStart) * 1000 / Frequency, 2) " ms."
return
; ===============================================================================================================================
GuiClose:
GuiEscape:
DllCall("GdiPlus.dll\GdipDeletePen", "ptr", hPen)
DllCall("GdiPlus.dll\GdipDeleteGraphics", "ptr", hCanvas)
DllCall("GdiPlus.dll\GdiplusShutdown", "ptr", hToken)
DllCall("FreeLibrary", "ptr", hGDIPLUS)
ExitApp
; ===============================================================================================================================
FRandom()
{
SetFormat, FloatFast, 0.15
Random, rand, 0.0, 1.0
return rand
}
IRandom()
{
Random, rand, 0, 0xFFFFFF
return rand
}
Alles anzeigen
Dadurch, dass aber weder AutoIt noch Autoh... konstante Werte zurückgeben (bei mir ca. 20000 - 38000 ms) lässt sich das schlecht vergleichen.
Hier ist ein Beispiel in AutoH... AHK_NVIDIA_NvAPI
Das was du brauchst musst du halt in AutoIt umschreiben.
Probier doch mal mit der DefWindowProc Function:
; POWER ON
DllCall("user32.dll", "lresult", "DefWindowProc", "hwnd", WinGetHandle('[CLASS:Progman]'), "uint", 0x0112, "wparam", 0xF170, "lparam", -1)
; SCHLAF MODUS
DllCall("user32.dll", "lresult", "DefWindowProc", "hwnd", WinGetHandle('[CLASS:Progman]'), "uint", 0x0112, "wparam", 0xF170, "lparam", 1)
; POWER OFF
DllCall("user32.dll", "lresult", "DefWindowProc", "hwnd", WinGetHandle('[CLASS:Progman]'), "uint", 0x0112, "wparam", 0xF170, "lparam", 2)
Edit:
Ist ein bisschen buggy das Ganze. Mal gehts, mal gehts nicht.
DllCall("user32.dll", "lresult", "DefWindowProc", "hwnd", _WinAPI_GetDesktopWindow(), "uint", 0x0112, "wparam", 0xF170, "lparam", -1)
Was aber bei mir zu 100% funktioniert hat, ist ein MouseClick oder MouseMove um den Monitor zurück zu holen (Hardware seitig)
Klassen sind schon was feines für sowas
Aber dafür verwende ich nen "Ableger*" von AutoIt
*Vorsicht.. Ban Grund im Main- (Eng) Forum alleine für die Erwähnung... haha
(Beide haben ihre Vor- und Nachteile und ich benutze beide)
1. Zum starten brauchst du kein Script was dir die Buttons drückt.
Unter Einstellungen findest du den Punkt "CCleaner starten" über Papierkorb.
Einfach aktivieren und mit Rechtsklick auf dein Papierkorb kannst du den CCleaner starten.
[Blockierte Grafik: https://i.imgur.com/00MWPLu.png]
2. Auch für das Herunterfahren nach dem Reinigen brauchst du dafür kein Script.
Einfach unter Einstellungen => Erweitert den Haken "Nach Bereinigung" herunterfahren aktivieren.
[Blockierte Grafik: https://i.imgur.com/IzI7JdK.png]
Ungetestet für deinen speziellen Fall zwecks durchreichen.
Aber evtl. mit der WM_DEVICECHANGE message. (Notifies an application of a change to the hardware configuration of a device or the computer.)
EM_SETCUEBANNER message (0x1501)
wParam: TRUE if the cue banner should show even when the edit control has focus; otherwise, FALSE. FALSE is the default behavior—the cue banner disappears when the user clicks in the control.
Ergo GUICtrlSendMsg($cIn, 0x1501, 1, "Bitte Web-Adresse oder Suchtext eingeben") sollte reichen
p.s.: für ComboBox gibt es die CB_SETCUEBANNER message (0x1703) dort gibt es allerdings nur Zero als wParam
Wie AspirinJunkie gesagt hatte:
Dafür gibt es die FormatMessage function. Diese wandelt den ErrorCode der GetLastError function in eine Fehlerbeschreibung um.
Diese Ausgabe entspricht den System Error Codes (auch in deutsch).
Du kannst das Ganze aber auch als "Dienst" oder "Aufgabenplanung" laufen lassen und somit es immer wieder starten wenn nicht vorhanden.
Btw. wenn du bei "Usern" eine Antiviren-Software installiert hast und die über einen Server verwaltest, haben diese "User" nicht die Möglichkeit dieses Antivieren-Programm zu schließen oder den Scan-Task abzubrechen.
Und dass das bei Kaspersky zu 100% so ist weiß ich, da wir es selbst mal im Einsatz hatten.
Und inwiefern solch ein Support (in diesem Forum) hier gegen die Foren-Regeln verstößt, kann ich dir nicht sagen..
Dann weiß ich ja, dass ich zukünftig die Crypt-Lib nicht mehr benutze, wenn ich einen einfachen Hash wie MD5 oder SHA-1 brauche.
Ja es ist Möglich dein Code in einen anderen Prozess oder .dll zu "injizieren" (inject).
Das benötigt aber ein bisschen Hintergrundwissen.
Daher rate ich dir, wenn du es wirklich vorhast (was das rechtliche angeht kann ich dir nichts dazu sagen), aufgrund meiner genannten Wörter dich ein wenig ein zu lesen.