<script src="../static/ga4.js" type="text/javascript"></script> </head> <body> <h1>Process</h1> <p>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.</p> <pre class="Syntax"><span class="func">Process</span>, <a href="#SubCommands">Unterbefehl</a> <span class="optional">, PIDOderName, Wert</span></pre> <h2 id="Parameters">Parameter</h2> <dl> <dt>Unterbefehl, Wert</dt> <dd>Diese Parameter sind voneinander abhängig und können wie <a href="#SubCommands">unten gezeigt</a> verwendet werden.</dd> <dt>PIDOderName</dt> <dd> <p>Eine Nummer (die PID) oder ein Prozessname, wie unten beschrieben. Dieser Parameter kann je nach verwendetem Unterbefehl leer sein oder weggelassen werden.</p> <p><strong>PID (Prozess-ID):</strong> Eine Nummer zur eindeutigen Identifizierung eines Prozesses (die Gültigkeit dieser Nummer ist an die Lebensdauer des Prozesses gebunden). Mit <a href="Run.htm">Run</a> kann die PID eines neuen Prozesses, der gestartet wurde, ermittelt werden. Mit <a href="WinGet.htm#PID">WinGet</a> kann die PID eines Fensters ermittelt werden. Der Process-Befehl selbst kann auch zum Abrufen einer PID verwendet werden.</p> <p><strong>Name:</strong> 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.</p> </dd> </dl> <h2 id="SubCommands">Unterbefehle</h2> <p>Geben Sie für <em>Unterbefehl</em> Folgendes an:</p> <ul> <li><a href="#Exist">Exist</a>: Prüft, ob ein bestimmter Prozess existiert.</li> <li><a href="#Close">Close</a>: Erzwingt die Schließung des ersten gefundenen Prozesses.</li> <li><a href="#List">List</a>: Noch nicht implementiert.</li> <li><a href="#Priority">Priority</a>: Ändert die Prioritätsstufe des ersten gefundenen Prozesses.</li> <li><a href="#Wait">Wait</a>: Wartet, bis ein bestimmter Prozess existiert.</li> <li><a href="#WaitClose">WaitClose</a>: Wartet, bis alle gefundenen Prozesse geschlossen sind.</li> </ul> <h3 id="Exist">Exist</h3> <p>Prüft, ob ein bestimmter Prozess existiert.</p> <pre class="Syntax"><span class="func">Process</span>, Exist <span class="optional">, PIDOderName</span></pre> <p><a href="../misc/ErrorLevel.htm">ErrorLevel</a> wird auf die Prozess-ID (PID) des gefundenen Prozesses gesetzt, andernfalls auf 0. Wenn <em>PIDOderName</em> leer ist oder weggelassen wird, wird die PID des Skripts abgerufen. Eine alternative, einzeilige Methode zum Abrufen der Skript-PID ist <code>PID := DllCall("GetCurrentProcessId")</code>.</p> <h3 id="Close">Close</h3> <p>Erzwingt die Schließung des ersten gefundenen Prozesses.</p> <pre class="Syntax"><span class="func">Process</span>, Close, PIDOderName</pre> <p>Wenn ein Prozess gefunden und erfolgreich terminiert wurde, wird <a href="../misc/ErrorLevel.htm">ErrorLevel</a> 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 <a href="WinClose.htm">WinClose</a> nicht ausreicht, um den Prozess normal zu beenden.</p> <p>Um die Schließung <u>aller</u> gefundenen Prozesse zu erzwingen, siehe <a href="#ExCloseAll">Beispiel #6</a>.</p> <h3 id="List">List</h3> <p>Obwohl dieser Unterbefehl noch nicht unterstützt wird, zeigt <a href="#ListEx">Beispiel #4</a>, wie eine Liste von Prozessen via <a href="DllCall.htm">DllCall()</a> abgerufen werden kann.</p> <h3 id="Priority">Priority</h3> <p>Ändert die Prioritätsstufe des ersten gefundenen Prozesses.</p> <pre class="Syntax"><span class="func">Process</span>, Priority, PIDOderName, Stufe</pre> <p>Ändert die Priorität (wie im Windows-Task-Manager angezeigt) des ersten gefundenen Prozesses auf <em>Stufe</em> und setzt <a href="../misc/ErrorLevel.htm">ErrorLevel</a> auf seine Prozess-ID (PID). Wenn <em>PIDOderName</em> 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.</p> <p><em>Stufe</em> 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.</p> <h3 id="Wait">Wait</h3> <p>Wartet, bis ein bestimmter Prozess existiert.</p> <pre class="Syntax"><span class="func">Process</span>, Wait, PIDOderName <span class="optional">, Zeitlimit</span></pre> <p>Geben Sie für <em>Zeitlimit</em> die maximale Wartezeit in Sekunden an (kann einen Dezimalpunkt enthalten). Wenn <em>Zeitlimit</em> leer ist oder weggelassen wird, wird der Unterbefehl unendlich lang warten. Wenn ein Prozess gefunden wurde, wird <a href="../misc/ErrorLevel.htm">ErrorLevel</a> auf seine Prozess-ID (PID) gesetzt. Wenn der Unterbefehl das Zeitlimit überschreitet, wird ErrorLevel auf 0 gesetzt.</p> <p>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 <a href="../misc/ErrorLevel.htm">ErrorLevel</a> sofort auf einen der oben beschriebenen Werte und fährt mit der Skriptausführung fort. Während der Unterbefehl wartet, können neue <a href="../misc/Threads.htm">Threads</a> via <a href="../Hotkeys.htm">Hotkeys</a>, <a href="Menu.htm">benutzerdefinierte Menüpunkte</a> oder <a href="SetTimer.htm">Timer</a> gestartet werden.</p> <h3 id="WaitClose">WaitClose</h3> <p>Wartet, bis <u>alle</u> gefundenen Prozesse geschlossen sind.</p> <pre class="Syntax"><span class="func">Process</span>, WaitClose, PIDOderName <span class="optional">, Zeitlimit</span></pre> <p>Geben Sie für <em>Zeitlimit</em> die maximale Wartezeit in Sekunden an (kann einen Dezimalpunkt enthalten). Wenn <em>Zeitlimit</em> leer ist oder weggelassen wird, wird der Unterbefehl unendlich lang warten. Wenn alle gefundenen Prozesse geschlossen sind, wird <a href="../misc/ErrorLevel.htm">ErrorLevel</a> auf 0 gesetzt. Wenn der Unterbefehl das Zeitlimit überschreitet, wird ErrorLevel auf die Prozess-ID (PID) des ersten gefundenen, noch existierenden Prozesses gesetzt.</p> <p>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 <a href="../misc/ErrorLevel.htm">ErrorLevel</a> sofort auf einen der oben beschriebenen Werte und fährt mit der Skriptausführung fort. Während der Unterbefehl wartet, können neue <a href="../misc/Threads.htm">Threads</a> via <a href="../Hotkeys.htm">Hotkeys</a>, <a href="Menu.htm">benutzerdefinierte Menüpunkte</a> oder <a href="SetTimer.htm">Timer</a> gestartet werden.</p> <h2 id="ErrorLevel">ErrorLevel</h2> <p><a href="../misc/ErrorLevel.htm">ErrorLevel</a> 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.</p> <h2 id="Related">Siehe auch</h2> <p><a href="Run.htm">Run</a>, <a href="WinGet.htm">WinGet</a>, <a href="WinClose.htm">WinClose</a>, <a href="WinKill.htm">WinKill</a>, <a href="WinWait.htm">WinWait</a>, <a href="WinWaitClose.htm">WinWaitClose</a>, <a href="WinExist.htm">WinExist()</a></p> <h2 id="Examples">Beispiele</h2> <div class="ex" id="ExBasic"> <p><a class="ex_number" href="#ExBasic"></a> Startet Notepad, setzt seine Priorität auf Hoch und meldet seine aktuelle PID.</p> <pre>Run notepad.exe,,, NeuePID Process, Priority, %NeuePID%, High MsgBox Die neue Notepad-PID ist %NeuePID%.</pre> </div> <div class="ex" id="ExAdvanced"> <p><a class="ex_number" href="#ExAdvanced"></a> 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.</p> <pre>Process, Wait, notepad.exe, 5.5 NeuePID := ErrorLevel <em>; Den Wert sofort speichern, da ErrorLevel ständig geändert wird.</em> if not NeuePID { MsgBox Der Prozess ist nicht innerhalb von 5.5 Sekunden erschienen. return } <em>; Andernfalls:</em> MsgBox Es ist ein passender Prozess erschienen (Prozess-ID ist %NeuePID%). Process, Priority, %NeuePID%, Low Process, Priority,, High <em>; Das Skript selbst auf hohe Priorität setzen.</em> WinClose Unbenannt - Editor Process, WaitClose, %NeuePID%, 5 if ErrorLevel <em>; Die PID existiert noch.</em> MsgBox Der Prozess wurde nicht innerhalb von 5 Sekunden geschlossen.</pre> </div> <div class="ex" id="ExHotkey"> <p><a class="ex_number" href="#ExHotkey"></a> Einen Hotkey drücken, um die Priorität des Prozesses des aktiven Fensters zu ändern.</p> <pre>#z:: <em>; WIN+Z-Hotkey</em> 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 <em>; andernfalls in den nächsten Label fallen:</em> 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</pre> </div> <div class="ex" id="ListEx"> <p><a class="ex_number" href="#ListEx"></a> Zeigt eine Liste von allen laufenden Prozessen an, die via <a href="DllCall.htm">DllCall()</a> abgerufen wurde.</p> <pre>d := " | " <em>; Zeichenkette als Trennung</em> s := 4096 <em>; Größe der Pufferspeicher und Arrays (4 KB)</em> Process, Exist <em>; Setzt ErrorLevel auf die PID des laufenden Skripts.</em> <em>; Handle dieses Skripts mit PROCESS_QUERY_INFORMATION (0x0400) abrufen:</em> h := DllCall("OpenProcess", "UInt", 0x0400, "Int", false, "UInt", ErrorLevel, "Ptr") <em>; Ein einstellbares Zugriffstoken mit diesem Prozess öffnen (TOKEN_ADJUST_PRIVILEGES = 32):</em> DllCall("Advapi32.dll\OpenProcessToken", "Ptr", h, "UInt", 32, "PtrP", t) VarSetCapacity(ti, 16, 0) <em>; Struktur mit Berechtigungen</em> NumPut(1, ti, 0, "UInt") <em>; Einen Eintrag in das Berechtigungen-Array einfügen ...</em> <em>; Die lokale eindeutige ID der Debug-Berechtigung abrufen:</em> DllCall("Advapi32.dll\LookupPrivilegeValue", "Ptr", 0, "Str", "SeDebugPrivilege", "Int64P", luid) NumPut(luid, ti, 4, "Int64") NumPut(2, ti, 12, "UInt") <em>; Diese Berechtigung aktivieren: SE_PRIVILEGE_ENABLED = 2</em> <em>; Die Berechtigungen dieses Prozesses mit dem neuen Zugriffstoken aktualisieren:</em> r := DllCall("Advapi32.dll\AdjustTokenPrivileges", "Ptr", t, "Int", false, "Ptr", &amp;ti, "UInt", 0, "Ptr", 0, "Ptr", 0) DllCall("CloseHandle", "Ptr", t) <em>; Zugriffstoken-Handle schließen, um Speicher freizugeben.</em> DllCall("CloseHandle", "Ptr", h) <em>; Prozess-Handle schließen, um Speicher freizugeben.</em> hModule := DllCall("LoadLibrary", "Str", "Psapi.dll") <em>; Performanz durch Vorabladen der Bibliothek erhöhen.</em> s := VarSetCapacity(a, s) <em>; Ein Array zum Speichern der Liste von Prozess-IDs:</em> c := 0 <em>; Zähler für die Prozess-IDs</em> DllCall("Psapi.dll\EnumProcesses", "Ptr", &amp;a, "UInt", s, "UIntP", r) Loop, % r // 4 <em>; Array für IDs als DWORDs (32 Bit) parsen:</em> { id := NumGet(a, A_Index * 4, "UInt") <em>; Prozess öffnen mit: PROCESS_VM_READ (0x0010) | PROCESS_QUERY_INFORMATION (0x0400)</em> h := DllCall("OpenProcess", "UInt", 0x0010 | 0x0400, "Int", false, "UInt", id, "Ptr") if !h continue VarSetCapacity(n, s, 0) <em>; Ein Puffer zum Speichern des Basisnamens des Moduls:</em> e := DllCall("Psapi.dll\GetModuleBaseName", "Ptr", h, "Ptr", 0, "Str", n, "UInt", A_IsUnicode ? s//2 : s) if !e <em>; Fallback-Methode für 64-Bit-Prozesse, wenn im 32-Bit-Modus:</em> if e := DllCall("Psapi.dll\GetProcessImageFileName", "Ptr", h, "Str", n, "UInt", A_IsUnicode ? s//2 : s) SplitPath n, n DllCall("CloseHandle", "Ptr", h) <em>; Prozess-Handle schließen, um Speicher freizugeben.</em> if (n &amp;&amp; e) <em>; Wenn Image ungleich Null ist, zur Liste hinzufügen:</em> l .= n . d, c++ } DllCall("FreeLibrary", "Ptr", hModule) <em>; Bibliothek entladen, um Speicher freizugeben.</em> <em>;Sort, l, C ; Entkommentiere diese Zeile, um die Liste alphabetisch zu sortieren.</em> MsgBox, 0, %c% Prozesse, %l%</pre> </div> <div class="ex" id="ListCom"> <p><a class="ex_number" href="#ListCom"></a> Zeigt eine Liste von allen laufenden Prozessen an, die via COM und <a href="https://learn.microsoft.com/windows/win32/cimwin32prov/win32-process">Win32_Process</a> abgerufen wurde.</p> <pre>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</pre> </div> <div class="ex" id="ExCloseAll"> <p><a class="ex_number" href="#ExCloseAll"></a> Erzwingt die Schließung <u>aller</u> gefundenen Prozesse.</p> <pre>ProcessCloseAll(PIDOderName) { Loop { Process, Close, % PIDOderName Process, Exist, % PIDOderName <em>; Verbessert in einigen Fällen die Zuverlässigkeit.</em> } Until not ErrorLevel } <em>; Beispiel:</em> Loop 3 Run, notepad.exe Sleep 3000 ProcessCloseAll("notepad.exe")</pre> </div> </body> </html>