Process

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

Parameter

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

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.

Unterbefehle

Geben Sie für Unterbefehl Folgendes an:

Exist

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

Close

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.

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

Wait

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.

WaitClose

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

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.

Bemerkungen

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

Beispiele

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