Was macht ein Script zum Prozess ?

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

gero
Posts: 162
Joined: 02 Oct 2013, 05:36

Was macht ein Script zum Prozess ?

Post by gero » 30 Mar 2021, 12:30

Hallo zusammen
Ich habe ein Verständnisproblem, was die Zählung der laufenden Prozesse angeht.

Bei mir laufen immer etliche Scripte und AHK-Programme (kompiliert) im Hintergrund.
Manche werden als Prozess gezählt und manche nicht.
Welche Bedingungen müssen erfüllt sein, dass ein Programm / Script als Prozess gerechnet wird ?
In der Hilfe werden unter "Process" 2 Scripte (NR.4 und Nr.5) als Beispiel angeführt ... nur liefern beide hier unterschiedliche Ergebnisse. Beim Start verschiedener Scripte geht der Counter im Taskmanager nach oben, andere werden nur angezeigt aber nicht als Prozess gezählt.

Also kurz: Was ist unter Windows ein Prozess ... und was - eben "irgend was anderes" ???

Ich hoffe ich habe mich verständlich ausgedrückt und bedanke mich schon mal fürs lesen.

gruss
gero
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Was macht ein Script zum Prozess ?

Post by BoBo » 30 Mar 2021, 13:14

Also das :arrow: hier ist schonmal reichlich Stoff, oder? :mrgreen:
gero
Posts: 162
Joined: 02 Oct 2013, 05:36

Re: Was macht ein Script zum Prozess ?

Post by gero » 30 Mar 2021, 14:19

Hallo BoBo ... ja, ja ... ich kenne das schon, aber ich habe da ein Verständnisproblem.

Ein GUI, welches auf dem Desktop liegt, ohne TIMER oder LOOP, also grad absolut nichts macht, nur da ist und auf Eingaben wartet, sich seiner blossen Existenz im RAM erfreut ... ist kein Prozess ? Das wird dann zwar im Taskmanager als TASK gelistet, wird aber nicht als Prozess betrachtet - richtig ???

gruss
gero
just me
Posts: 9425
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Was macht ein Script zum Prozess ?

Post by just me » 31 Mar 2021, 07:03

Moin,

jedes AHK-Skript bzw. jede AHK-Exe braucht einen Prozess, um laufen zu können. Welche Prozesse Dir angezeigt werden, hängt in den UAC-Versionen von Windows von den Rechten des Skripts und Deinen eigenen ab. Eine recht vollständige Prozessliste zeigt der Taskmanager unter 'Details'.
gero
Posts: 162
Joined: 02 Oct 2013, 05:36

Re: Was macht ein Script zum Prozess ?

Post by gero » 01 Apr 2021, 02:33

Guten Morgen
Ist ja keine wirklich gosse Sache, nur würde ich's halt gern verstehen.
Nicht jedes Script verändert den Process-Counter hier.
Habe mal was aus der Hilfe zusammenkopiert, um meine Eingangsfrage zu verdeutlichen.

gruss
gero

Code: Select all

#NoEnv
#SingleInstance force
Gui,Font,s14
Gui + AlwaysOnTop
Gui,Add,Text, x10 y10 w100 center vVia_DLLcall,
Gui,Add,Text, x+0 yp wp center vVia_COM,
Gui,Show,x100 y20,ProcessCheck
d := "  |  "  ; Zeichenkette-Trennzeichen
s := 4096  ; Größe der Pufferspeicher und Arrays (4 KB)

Loop
{
; >>>>>>>>>>>>>>>>>>>>  Hilfe / Beispiel #5

COUNTER:=""
for Prozess in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process")
    COUNTER++
GuiControl,,Via_COM,% "COM = " . COUNTER


; >>>>>>>>>>>>>>>>>>>>   Hilfe / Beispiel #4

Process, Exist  ; Setzt ErrorLevel auf die PID des laufenden Skripts.
; Ermittelt den 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 Performance 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%
GuiControl,,Via_DLLcall,% "DLL= " . c
sleep 1000
}
return

GuiClose:
DllCall("FreeLibrary", "Ptr", hModule)
exitapp
just me
Posts: 9425
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Was macht ein Script zum Prozess ?

Post by just me » 02 Apr 2021, 04:12

Hallo gero,

ich kann dein Problem noch nicht erkennen. Wenn Du Dein Testprogramm laufen lässt und dann als identischer Benutzer ein AHK-Skript oder eine AHK-Exe startest, die mit identischen Rechten läuft, muss sich die Anzahl der ermittelten Prozesse um 1 erhöhen.

Ich habe nicht geprüft, ob sich im Testskript Fehler verbergen. Für das finden des neuen Prozesses muss der Taskmanager reichen. Wenn dort ein Prozess auftaucht, den Dein Skript nicht findet, liegt der Fehler im Skript.

Die Skripte bzw. Exen müssen allerdings geladen bleiben, sonst gehen sie Dir evtl. durch die Lappen. Hast Du ein kurzes Beispiel für ein Skript, das nicht gezählt wird?
Post Reply

Return to “Ich brauche Hilfe”