Führt verschiedene Operationen an einem Prozess durch: Prüft, ob er existiert; ändert seine Priorität; schließt ihn; wartet, bis er geschlossen wird.
Process, Unterbefehl , PIDOderName, Wert
Eine Nummer (die PID) oder ein Prozessname, wie unten beschrieben. Dieser Parameter kann je nach verwendetem Unterbefehl leer sein oder weggelassen werden.
PID (Prozess-ID): Eine Nummer zur eindeutigen Identifizierung eines Prozesses (die Gültigkeit dieser Nummer ist an die Lebensdauer des Prozesses gebunden). Mit Run kann die PID eines neuen Prozesses, der gestartet wurde, ermittelt werden. Mit WinGet kann die PID eines Fensters ermittelt werden. Der Process-Befehl selbst kann auch zum Abrufen einer PID verwendet werden.
Name: Der Name eines Prozesses (ohne Pfad), den üblicherweise auch seine EXE-Datei hat, z.B. notepad.exe oder winword.exe. Da ein Name mit mehreren laufenden Prozessen übereinstimmen kann, wird nur der erste Prozess berücksichtigt. Der Name ist nicht Groß-/Kleinschreibung-sensitiv.
Geben Sie für Unterbefehl Folgendes an:
Prüft, ob ein bestimmter Prozess existiert.
Process, Exist , PIDOderName
ErrorLevel wird auf die Prozess-ID (PID) des gefundenen Prozesses gesetzt, andernfalls auf 0. Wenn PIDOderName leer ist oder weggelassen wird, wird die PID des Skripts abgerufen. Eine alternative, einzeilige Methode zum Abrufen der Skript-PID ist PID := DllCall("GetCurrentProcessId")
.
Erzwingt die Schließung des ersten gefundenen Prozesses.
Process, Close, PIDOderName
Wenn ein Prozess gefunden und erfolgreich terminiert wurde, wird ErrorLevel auf seine ehemalige Prozess-ID (PID) gesetzt. Andernfalls (also wenn kein Prozess gefunden wurde oder der Prozess nicht terminiert werden konnte) wird ErrorLevel auf 0 gesetzt. Da der Prozess abrupt terminiert wird - mit der Gefahr, dass seine Ausführung an einem kritischen Punkt unterbrochen wird oder dass ungespeicherte Daten in seinen Fenstern (falls vorhanden) verloren gehen - sollte dieser Unterbefehl nur verwendet werden, wenn das Schließen seiner Fenster via WinClose nicht ausreicht, um den Prozess normal zu beenden.
Um die Schließung aller gefundenen Prozesse zu erzwingen, siehe Beispiel #6.
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 PIDOderName leer ist, wird die Priorität des Skripts geändert. Wenn kein Prozess gefunden wurde oder ein Problem beim Ändern seiner Priorität aufgetreten ist, wird ErrorLevel auf 0 gesetzt.
Stufe muss 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 für eine Ausführung in Echtzeit (Realtime) ausgelegt ist, kann die Systemstabilität beeinträchtigen, wenn er auf diese Prioritätsstufe gesetzt wird.
Wartet, bis ein bestimmter Prozess existiert.
Process, Wait, PIDOderName , Zeitlimit
Geben Sie für Zeitlimit die maximale Wartezeit in Sekunden an (kann einen Dezimalpunkt enthalten). Wenn Zeitlimit leer ist oder weggelassen wird, wird der Unterbefehl unendlich lang warten. Wenn ein Prozess gefunden wurde, wird ErrorLevel auf seine Prozess-ID (PID) gesetzt. Wenn der Unterbefehl das Zeitlimit überschreitet, wird ErrorLevel auf 0 gesetzt.
Prozesse werden alle 100 Millisekunden überprüft; sobald die Bedingung erfüllt ist, hört der Unterbefehl auf zu warten. Mit anderen Worten, der Unterbefehl wartet nicht, bis das Zeitlimit abgelaufen ist, sondern setzt ErrorLevel sofort auf einen der oben beschriebenen Werte und fährt mit der Skriptausführung fort. Während der Unterbefehl wartet, können neue Threads via Hotkeys, benutzerdefinierte Menüpunkte oder Timer gestartet werden.
Wartet, bis alle gefundenen Prozesse geschlossen sind.
Process, WaitClose, PIDOderName , Zeitlimit
Geben Sie für Zeitlimit die maximale Wartezeit in Sekunden an (kann einen Dezimalpunkt enthalten). Wenn Zeitlimit leer ist oder weggelassen wird, wird der Unterbefehl unendlich lang warten. Wenn alle gefundenen Prozesse geschlossen sind, wird ErrorLevel auf 0 gesetzt. Wenn der Unterbefehl das Zeitlimit überschreitet, wird ErrorLevel auf die Prozess-ID (PID) des ersten gefundenen, noch existierenden Prozesses gesetzt.
Prozesse werden alle 100 Millisekunden überprüft; sobald die Bedingung erfüllt ist, hört der Unterbefehl auf zu warten. Mit anderen Worten, der Unterbefehl wartet nicht, bis das Zeitlimit abgelaufen ist, sondern setzt ErrorLevel sofort auf einen der oben beschriebenen Werte und fährt mit der Skriptausführung fort. Während der Unterbefehl wartet, können neue Threads via Hotkeys, benutzerdefinierte Menüpunkte oder Timer gestartet werden.
ErrorLevel wird auf 0 gesetzt, wenn ein Unterbefehl fehlgeschlagen ist oder das Zeitlimit überschritten hat. Andernfalls wird es auf eine Prozess-ID (PID) gesetzt. Schauen Sie sich die obigen Unterbefehle an, um mehr zu erfahren.
Run, WinGet, WinClose, WinKill, WinWait, WinWaitClose, WinExist()
Startet Notepad, setzt seine Priorität auf Hoch und meldet seine aktuelle PID.
Run notepad.exe,,, NeuePID Process, Priority, %NeuePID%, High MsgBox Die neue Notepad-PID ist %NeuePID%.
Wartet, bis ein Notepad-Prozess erscheint. Wenn einer innerhalb von 5,5 Sekunden erscheint, wird seine Priorität auf Niedrig und die Priorität des Skripts auf Hoch gesetzt. Danach wird versucht, den Prozess innerhalb von 5 Sekunden zu beenden.
Process, Wait, notepad.exe, 5.5 NeuePID := ErrorLevel ; Den Wert sofort speichern, da ErrorLevel ständig geändert wird. if not NeuePID { MsgBox Der Prozess ist nicht innerhalb von 5.5 Sekunden erschienen. return } ; Andernfalls: MsgBox Es ist ein passender Prozess erschienen (Prozess-ID ist %NeuePID%). Process, Priority, %NeuePID%, Low Process, Priority,, High ; Das Skript selbst auf hohe Priorität setzen. WinClose Unbenannt - Editor Process, WaitClose, %NeuePID%, 5 if ErrorLevel ; Die PID existiert noch. MsgBox Der Prozess wurde nicht innerhalb von 5 Sekunden geschlossen.
Einen Hotkey drücken, 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 doppelklicken Sie auf eine`nneue Prioritätsstufe 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 ; andernfalls in den nächsten Label fallen: 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
Zeigt eine Liste von allen laufenden Prozessen an, die via DllCall() abgerufen wurde.
d := " | " ; Zeichenkette als Trennung s := 4096 ; Größe der Pufferspeicher und Arrays (4 KB) Process, Exist ; Setzt ErrorLevel auf die PID des laufenden Skripts. ; Handle dieses Skripts mit PROCESS_QUERY_INFORMATION (0x0400) abrufen: h := DllCall("OpenProcess", "UInt", 0x0400, "Int", false, "UInt", ErrorLevel, "Ptr") ; Ein einstellbares Zugriffstoken mit diesem Prozess öffnen (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") ; Einen Eintrag in das Berechtigungen-Array einfügen ... ; Die lokale eindeutige ID der Debug-Berechtigung abrufen: DllCall("Advapi32.dll\LookupPrivilegeValue", "Ptr", 0, "Str", "SeDebugPrivilege", "Int64P", luid) NumPut(luid, ti, 4, "Int64") NumPut(2, ti, 12, "UInt") ; Diese Berechtigung aktivieren: SE_PRIVILEGE_ENABLED = 2 ; Die Berechtigungen dieses Prozesses mit dem neuen Zugriffstoken aktualisieren: r := DllCall("Advapi32.dll\AdjustTokenPrivileges", "Ptr", t, "Int", false, "Ptr", &ti, "UInt", 0, "Ptr", 0, "Ptr", 0) DllCall("CloseHandle", "Ptr", t) ; Zugriffstoken-Handle schließen, um Speicher freizugeben. DllCall("CloseHandle", "Ptr", h) ; Prozess-Handle schließen, um Speicher freizugeben. hModule := DllCall("LoadLibrary", "Str", "Psapi.dll") ; Performanz durch Vorabladen der Bibliothek erhöhen. s := VarSetCapacity(a, s) ; Ein Array zum Speichern der Liste von Prozess-IDs: c := 0 ; Zähler für die Prozess-IDs DllCall("Psapi.dll\EnumProcesses", "Ptr", &a, "UInt", s, "UIntP", r) Loop, % r // 4 ; Array für IDs als DWORDs (32 Bit) parsen: { id := NumGet(a, A_Index * 4, "UInt") ; Prozess öffnen 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 Puffer zum Speichern des Basisnamens 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 im 32-Bit-Modus: if e := DllCall("Psapi.dll\GetProcessImageFileName", "Ptr", h, "Str", n, "UInt", A_IsUnicode ? s//2 : s) SplitPath n, n DllCall("CloseHandle", "Ptr", h) ; Prozess-Handle schließen, um Speicher freizugeben. if (n && e) ; Wenn Image ungleich Null ist, zur Liste hinzufügen: l .= n . d, c++ } DllCall("FreeLibrary", "Ptr", hModule) ; Bibliothek entladen, um Speicher freizugeben. ;Sort, l, C ; Entkommentiere diese Zeile, um die Liste alphabetisch zu sortieren. MsgBox, 0, %c% Prozesse, %l%
Zeigt eine Liste von allen laufenden Prozessen an, die via COM und Win32_Process abgerufen wurde.
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
Erzwingt die Schließung aller gefundenen Prozesse.
ProcessCloseAll(PIDOderName) { Loop { Process, Close, % PIDOderName Process, Exist, % PIDOderName ; Verbessert in einigen Fällen die Zuverlässigkeit. } Until not ErrorLevel } ; Beispiel: Loop 3 Run, notepad.exe Sleep 3000 ProcessCloseAll("notepad.exe")