Process

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

Parameter

Unterbefehl, Wert
Diese Parameter sind voneinander abhängig und können wie unten gezeigt verwendet werden.
PIDOderName

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.

Unterbefehle

Geben Sie für Unterbefehl Folgendes an:

Exist

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").

Close

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.

List

Obwohl dieser Unterbefehl noch nicht unterstützt wird, zeigt Beispiel #4, wie eine Liste von Prozessen via DllCall() abgerufen werden kann.

Priority

Ä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.

Wait

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.

WaitClose

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

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()

Beispiele

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")