Führt verschiedene Operationen an einem Prozess aus: überprüft, ob er vorhanden ist; ändert seine Priorität; schließt ihn; wartet, bis er geschlossen wurde.
Process, Unterbefehl , PIDOderName, Wert
Dieser Parameter kann entweder eine Nummer (die PID) oder ein Prozessname sein, wie unten beschrieben. Er kann zudem leer gelassen werden, um die Priorität des Skripts selbst zu ändern.
PID: Die Prozess-ID in Form einer Nummer zur eindeutigen Identifizierung eines Prozesses (diese Nummer ist nur gültig, solange es diesen Prozess gibt). Mit dem Run-Befehl kann die PID eines neu gestarteten Prozesses ermittelt werden. Im Vergleich dazu kann mit WinGet die PID eines Fensters ermittelt werden. Der Process-Befehl selbst kann auch zum Abrufen eine PID verwendet werden.
Name: Der Name eines Prozesses, den üblicherweise auch seine ausführbare Datei hat (ohne Pfad), z. B. notepad.exe oder winword.exe. Da ein Name mit mehreren laufenden Prozessen übereinstimmen kann, wird nur der erste Prozess einbezogen. Der Name ist nicht Groß-/Kleinschreibung-sensitiv.
Geben Sie für Unterbefehl Folgendes an:
Überprüft, ob ein bestimmter Prozess vorhanden ist.
Process, Exist , PIDOderName
Setzt ErrorLevel auf die Prozess-ID (PID) des gefundenen Prozesses, oder ansonsten auf 0. Wenn der PIDOderName-Parameter leer ist, wird die PID des Skripts abgerufen. Eine alternative Methode zum Abrufen der Skript-PID ist PID := DllCall("GetCurrentProcessId")
.
Erzwingt das Schließen des ersten gefundenen Prozesses.
Process, Close , PIDOderName
Nachdem ein gefundener Prozess erfolgreich terminiert wurde, wird ErrorLevel auf seine ehemalige Prozess-ID (PID) gesetzt. Ansonsten wird ErrorLevel auf 0 gesetzt (also wenn ein Prozess nicht gefunden wurde oder nicht terminiert werden konnte). Da der Prozess abrupt terminiert wird - mit der Chance, dass seine Ausführung an einem kritischen Punkt unterbrochen wird oder dass ungespeicherte Daten innerhalb seiner Fenster (sofern er welche hat) verloren gehen - sollte diese Methode nur verwendet werden, wenn ein Prozess durch Anwenden von WinClose an eines seiner Fenster nicht geschlossen werden kann.
Obwohl dieser Unterbefehl noch nicht unterstützt wird, zeigt Beispiel #4, wie eine Liste von Prozessen via DllCall() abgerufen werden kann.
Ändert die Prioritätsstufe des ersten gefundenen Prozesses.
Process, Priority, PIDOderName, Stufe
Ändert die Priorität (wie im Windows-Task-Manager angezeigt) des ersten gefundenen Prozesses auf Stufe und setzt ErrorLevel auf seine Prozess-ID (PID). Wenn der PIDOderName-Parameter leer ist, wird die Priorität des Skripts geändert. Wenn ein Prozess nicht gefunden wurde oder gab es Probleme beim Ändern seiner Priorität, wird ErrorLevel auf 0 gesetzt.
Stufe sollte einer der folgenden Buchstaben oder Wörter sein: L (oder Low), B (oder BelowNormal), N (oder Normal), A (oder AboveNormal), H (oder High), R (oder Realtime). Hinweis: Jeder Prozess, der nicht darauf abgestimmt ist, in Echtzeit (Realtime) zu laufen, könnte die Systemstabilität reduzieren, wenn er auf diese Priorität gesetzt wird.
Wartet, bis ein bestimmter Prozess existiert.
Process, Wait, PIDOderName , Zeitlimit
Geben Sie für Zeitlimit die maximale Wartezeit in Sekunden an (kann ein Dezimalpunkt enthalten). Lässt man Zeitlimit weg, wird der Unterbefehl unendlich lang warten. Wenn ein Prozess gefunden wurde, wird ErrorLevel auf seine Prozess-ID (PID) gesetzt. Hat der Unterbefehl das Zeitlimit überschritten, wird ErrorLevel auf 0 gesetzt.
Wartet, bis alle gefundenen Prozesse geschlossen sind.
Process, WaitClose, PIDOderName , Zeitlimit
Geben Sie für Zeitlimit die maximale Wartezeit in Sekunden an (kann ein Dezimalpunkt enthalten). Lässt man Zeitlimit weg, wird der Unterbefehl unendlich lang warten. Wenn alle gefundenen Prozesse geschlossen sind, wird ErrorLevel auf 0 gesetzt. Hat der Unterbefehl das Zeitlimit überschritten, wird ErrorLevel auf die Prozess-ID (PID) des ersten noch vorhandenen gefundenen Prozesses gesetzt.
ErrorLevel wird auf 0 gesetzt, wenn ein Unterbefehl scheitert oder das Zeitlimit überschreitet. Ansonsten wird es auf eine Prozess-ID (PID) gesetzt. Schauen Sie sich die Unterbefehle oben an, um mehr zu erfahren.
Für die Unterbefehle Wait und WaitClose: Prozesse werden alle 100 Millisekunden überprüft; sobald die Bedingung erfüllt wurde, hört der Unterbefehl auf zu warten. Das heißt, dass der Unterbefehl nicht bis zum Ablaufen des Zeitlimits wartet, sondern dass er ErrorLevel sofort auf einen der oben genannten Werte setzt und dann die Ausführung des Skripts fortsetzt. Während der Unterbefehl im Wartezustand ist, können neue Threads via Hotkeys, benutzerdefinierte Menüpunkte oder Timer gestartet werden.
Run, WinGet, WinClose, WinKill, WinWait, WinWaitClose, WinExist()
Startet den Texteditor, setzt seine Priorität auf "Hoch" und meldet seine aktuelle PID.
Run notepad.exe,,, NeuePID Process, Priority, %NeuePID%, High MsgBox Die PID des neu gestarteten Texteditors ist %NeuePID%.
Wartet bis zu 5.5 Sekunden auf das Erscheinen des Texteditors. Wenn der Texteditor innerhalb dieses Zeitrahmens erscheint, wird seine Priorität auf "Niedrig" und die Priorität des Skripts auf "Hoch" gesetzt. Danach wird der Texteditor geschlossen und ein Mitteilungsfenster angezeigt, wenn der Texteditor nicht innerhalb von 5 Sekunden geschlossen wird.
Process, Wait, notepad.exe, 5.5 NeuePID := ErrorLevel ; Den Wert sofort speichern, da ErrorLevel ständig geändert wird. if not NeuePID { MsgBox Der angegebene Prozess ist innerhalb der 5.5 Sekunden nicht erschienen. return } ; Ansonsten: MsgBox Es wurde passender Prozess gefunden (Prozess-ID ist %NeuePID%). Process, Priority, %NeuePID%, Low Process, Priority,, High ; Lässt das Skript sich selbst auf hohe Priorität setzen. WinClose Unbenannt - Editor Process, WaitClose, %NeuePID%, 5 if ErrorLevel ; Die PID ist noch vorhanden. MsgBox Der Prozess wurde innerhalb von 5 Sekunden nicht geschlossen.
Drücken Sie einen Hotkey, um die Priorität des Prozesses des aktiven Fensters zu ändern.
#z:: ; WIN+Z-Hotkey WinGet, aktive_pid, PID, A WinGetTitle, aktiver_titel, A Gui, 5:Add, Text,, Drücken Sie ESCAPE zum Abbrechen, oder klicken Sie doppelt auf einen`nneuen Prioritätslevel für das folgende Fenster:`n%aktiver_titel% Gui, 5:Add, ListBox, vMeineListBox gMeineListBox r5, Normal|High|Low|BelowNormal|AboveNormal Gui, 5:Add, Button, default, OK Gui, 5:Show,, Priorität setzen return 5GuiEscape: 5GuiClose: Gui, Destroy return MeineListBox: if (A_GuiEvent != "DoubleClick") return ; springe ansonsten zum nächsten Label: 5ButtonOK: GuiControlGet, MeineListBox Gui, Destroy Process, Priority, %aktive_pid%, %MeineListBox% if ErrorLevel MsgBox Erfolg: Die Priorität wurde auf "%MeineListBox%" gesetzt. else MsgBox Fehler: Die Priorität konnte nicht auf "%MeineListBox%" gesetzt werden. return
Ermittelt eine Liste von allen laufenden Prozessen via DllCall() und zeigt sie dann in einem Mitteilungsfenster an.
d := " | " ; Zeichenkette-Trennzeichen s := 4096 ; Größe der Pufferspeicher und Arrays (4 KB) Process, Exist ; Setzt ErrorLevel auf die PID des laufenden Skripts. ; Ermittelt das Handle des Skripts mit PROCESS_QUERY_INFORMATION (0x0400): h := DllCall("OpenProcess", "UInt", 0x0400, "Int", false, "UInt", ErrorLevel, "Ptr") ; Öffnet einen anpassbaren Zugriffstoken mit diesem Prozess (TOKEN_ADJUST_PRIVILEGES = 32): DllCall("Advapi32.dll\OpenProcessToken", "Ptr", h, "UInt", 32, "PtrP", t) VarSetCapacity(ti, 16, 0) ; Struktur mit Berechtigungen NumPut(1, ti, 0, "UInt") ; Setzt einen Eintrag in das Array mit Berechtigungen ... ; Ermittelt den lokalen eindeutigen Identifikator der Debug-Berechtigung: DllCall("Advapi32.dll\LookupPrivilegeValue", "Ptr", 0, "Str", "SeDebugPrivilege", "Int64P", luid) NumPut(luid, ti, 4, "Int64") NumPut(2, ti, 12, "UInt") ; Aktiviert diese Berechtigung: SE_PRIVILEGE_ENABLED = 2 ; Aktualisiert die Berechtigungen des Prozesses mit dem neuen Zugriffstoken: r := DllCall("Advapi32.dll\AdjustTokenPrivileges", "Ptr", t, "Int", false, "Ptr", &ti, "UInt", 0, "Ptr", 0, "Ptr", 0) DllCall("CloseHandle", "Ptr", t) ; Schließt diesen Zugriffstoken-Handle, um Speicher freizugeben. DllCall("CloseHandle", "Ptr", h) ; Schließt diesen Prozess-Handle, um Speicher freizugeben. hModule := DllCall("LoadLibrary", "Str", "Psapi.dll") ; Erhöht die Leistung durch Vorausladen der Bibliothek. s := VarSetCapacity(a, s) ; Ein Array, in der die Liste der Prozessidentifikatoren gespeichert wird: c := 0 ; Zähler für die Prozess-IDs DllCall("Psapi.dll\EnumProcesses", "Ptr", &a, "UInt", s, "UIntP", r) Loop, % r // 4 ; Parst das Array mit Identifikatoren als DWORDs (32 Bit): { id := NumGet(a, A_Index * 4, "UInt") ; Öffnet Prozess mit: PROCESS_VM_READ (0x0010) | PROCESS_QUERY_INFORMATION (0x0400) h := DllCall("OpenProcess", "UInt", 0x0010 | 0x0400, "Int", false, "UInt", id, "Ptr") if !h continue VarSetCapacity(n, s, 0) ; Ein Pufferspeicher für den Basisnamen des Moduls: e := DllCall("Psapi.dll\GetModuleBaseName", "Ptr", h, "Ptr", 0, "Str", n, "UInt", A_IsUnicode ? s//2 : s) if !e ; Fallback-Methode für 64-Bit-Prozesse, wenn sie im 32-Bit-Modus sind: if e := DllCall("Psapi.dll\GetProcessImageFileName", "Ptr", h, "Str", n, "UInt", A_IsUnicode ? s//2 : s) SplitPath n, n DllCall("CloseHandle", "Ptr", h) ; Schließt diesen Prozess-Handle, um Speicher freizugeben if (n && e) ; Wenn Image nicht null ist, füge es zur Liste hinzu: l .= n . d, c++ } DllCall("FreeLibrary", "Ptr", hModule) ; Entlädt die Bibliothek, um Speicher freizugeben. ;Sort, l, C ; Heben Sie die Kommentierung in dieser Zeile auf, um die Liste alphabetisch zu sortieren. MsgBox, 0, %c% Prozesse, %l%
Ermittelt eine Liste von allen laufenden Prozessen via COM. Bezüglich Win32_Process siehe Microsoft Docs.
Gui, Add, ListView, x2 y0 w400 h500, Prozessname|Befehlszeile for Prozess in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process") LV_Add("", Prozess.Name, Prozess.CommandLine) Gui, Show,, Prozessliste