Seite 1 von 2
Liste der Prozessnamen - unsichtbare Prozesse ausblenden?
Verfasst: 07.02.2021 17:52
von Zerosurf
Wie kann ich bei folgendem Code die unsichtbaren Prozesse nicht anzeigen lassen:
Code: Alles auswählen
;Autor: Hroudtwolf
EnableExplicit
Prototype.l pProcessCallback ( lPID.l , lModuleID.l , lThreadAmount.l , lParentPID.l , lPrioClass.l , sExeFile.s , lParam.l )
Procedure EnumProcesses ( *Callback.pProcessCallback , lParam.l = #Null )
Protected lSnap .l
Protected pPInfo .PROCESSENTRY32
If Not *Callback
ProcedureReturn #False
EndIf
lSnap = CreateToolhelp32Snapshot_( #TH32CS_SNAPPROCESS , #Null )
If Not lSnap
ProcedureReturn #False
EndIf
pPInfo\dwSize = SizeOf ( PROCESSENTRY32 )
If Process32First_( lSnap , pPInfo )
If Not *Callback ( pPInfo\th32ProcessID , pPInfo\th32ModuleID , pPInfo\cntThreads , pPInfo\th32ParentProcessID , pPInfo\pcPriClassBase , PeekS ( @ pPInfo\szExeFile ) , lParam )
ProcedureReturn #True
EndIf
While Process32Next_( lSnap , pPInfo )
If Not *Callback ( pPInfo\th32ProcessID , pPInfo\th32ModuleID , pPInfo\cntThreads , pPInfo\th32ParentProcessID , pPInfo\pcPriClassBase , PeekS ( @ pPInfo\szExeFile ) , lParam )
ProcedureReturn #True
EndIf
Wend
EndIf
CloseHandle_ ( lSnap )
ProcedureReturn #True
EndProcedure
Procedure ProcessCallback ( lPID.l , lModuleID.l , lThreadAmount.l , lParentPID.l , lPrioClass.l , sExeFile.s , lParam.l )
AddGadgetItem(1,-1,sExeFile,0,0)
ProcedureReturn #True
EndProcedure
If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
ListViewGadget(1,10,10,480,230,0)
EnumProcesses ( @ ProcessCallback () )
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Re: Liste der Prozessnamen - unsichtbare Prozesse ausblenden
Verfasst: 07.02.2021 18:23
von Mijikai
Was für unsichtbare Prozesse?
Btw. der Code hat Fehler z.B. wird das Snapshot Handle nicht korrekt überprüft.
Re: Liste der Prozessnamen - unsichtbare Prozesse ausblenden
Verfasst: 07.02.2021 18:47
von Zerosurf
Hab den Code von:
https://www.rsbasic.de/aktualisierung/w ... ssnamen.pb
Bei meinem Code Beispiel werden alle offenen Anwendungen mit Fenstertitel, Classen und Handles angezeigt:
Code: Alles auswählen
EnableExplicit
Procedure ListWindows(hwnd,lParam)
Protected.s title = Space(1000),class = Space(1000)
If GetWindowLong_(hwnd,#GWL_EXSTYLE) ! #WS_EX_TOOLWINDOW And GetWindowLong_(hwnd,#GWL_STYLE) & #WS_VISIBLE
GetClassName_(hwnd,class,1000)
GetWindowText_(hwnd,title,1000)
If title <> ""
Debug "Title: "+title+" | Class: "+class+" | Handle: "+Str(hwnd)
EndIf
EndIf
ProcedureReturn #True
EndProcedure
EnumChildWindows_(FindWindow_("ToolbarWindow32",0),@ListWindows(),0)
Jetzt versuche ich den dazugehörigen Prozess (Programm.exe) anzeigen zu lassen, komm aber nicht drauf, wie das am einfachsten zu bewerkstelligen ist.
Re: Liste der Prozessnamen - unsichtbare Prozesse ausblenden
Verfasst: 07.02.2021 19:26
von Mijikai
Zerosurf hat geschrieben:
...
Bei meinem Code Beispiel werden alle offenen Anwendungen mit Fenstertitel, Classen und Handles angezeigt:
...
.
Nein, es werden nur Informationen zu bestimmten Fenstern angezeigt welche anhand der 'Styles' ausgesucht wurden.
Der Code hat zudem kein vernünftiges Errorhandling.
Zerosurf hat geschrieben:
... versuche ich den dazugehörigen Prozess (Programm.exe) anzeigen zu lassen, komm aber nicht drauf, wie das am einfachsten zu bewerkstelligen ist.
Sollte so gehen:
Code: Alles auswählen
Procedure.s GetProcessNameByWindow(Handle.i)
Protected id.i
Protected proc.i
Protected buffer.s
GetWindowThreadProcessId_(Handle,@id)
proc = OpenProcess_(#PROCESS_VM_READ|#PROCESS_QUERY_INFORMATION,#False,id)
If proc
buffer = Space(#MAX_PATH)
If GetModuleFileName_(proc,@buffer,#MAX_PATH)
CloseHandle_(proc)
ProcedureReturn buffer
EndIf
CloseHandle_(proc)
EndIf
ProcedureReturn #Null$
EndProcedure
Re: Liste der Prozessnamen - unsichtbare Prozesse ausblenden
Verfasst: 07.02.2021 19:48
von Zerosurf
Was mach ich da falsch? Es zeigt nichts an beim Debugger
Code: Alles auswählen
EnableExplicit
Procedure.s GetProcessNameByWindow(Handle.i)
Protected id.i
Protected proc.i
Protected buffer.s
GetWindowThreadProcessId_(Handle,@id)
proc = OpenProcess_(#PROCESS_VM_READ|#PROCESS_QUERY_INFORMATION,#False,id)
If proc
buffer = Space(#MAX_PATH)
If GetModuleFileName_(proc,@buffer,#MAX_PATH)
CloseHandle_(proc)
ProcedureReturn buffer
EndIf
CloseHandle_(proc)
EndIf
ProcedureReturn #Null$
EndProcedure
Debug GetProcessNameByWindow(461752)
Re: Liste der Prozessnamen - unsichtbare Prozesse ausblenden
Verfasst: 07.02.2021 20:13
von Mijikai
War die Ex Version der Funktion habe es korrigiert:
Code: Alles auswählen
Import "kernel32.lib";<- wenn purebasics kernel.lib diese funktion nicht hat dann die die kernel.lib von ms verwenden!
GetModuleHandleExW.i(dwFlags.i,*lpModuleName,*phModule)
EndImport
Procedure.s GetProcessNameByWindow(Handle.i)
Protected id.i
Protected proc.i
Protected buffer.s
GetWindowThreadProcessId_(Handle,@id)
proc = OpenProcess_(#PROCESS_VM_READ|#PROCESS_QUERY_INFORMATION,#False,id)
If proc
buffer = Space(#MAX_PATH)
GetModuleHandleExW(#Null,#Null,@id)
If GetModuleFileName_(id,@buffer,#MAX_PATH)
CloseHandle_(proc)
ProcedureReturn buffer
EndIf
CloseHandle_(proc)
EndIf
ProcedureReturn #Null$
EndProcedure
Re: Liste der Prozessnamen - unsichtbare Prozesse ausblenden
Verfasst: 07.02.2021 20:20
von Zerosurf
Wenn ich jetzt diesen Code verwende und mit
laufen lasse, dann zeigt der Debugger immer das an:
C:\Users\marco\AppData\Local\Temp\PureBasic_Compilation12.exe
egal welche andere Handel Nummer ich eingebe! hmmm...
Re: Liste der Prozessnamen - unsichtbare Prozesse ausblenden
Verfasst: 07.02.2021 20:39
von Mijikai
Hatte die falsche Ex Funktion geändert (GetModuleHandle war unnötig).
Code: Alles auswählen
;wenn die purebasics libs diese funktionen nicht haben dann die dev libs von ms verwenden!
EnableExplicit
Import "Psapi.Lib"
GetModuleFileNameExW.i(hProcess,hModule,*lpFilename,nSize.i)
EndImport
Procedure.s GetProcessNameByWindow(Handle.i)
Protected id.i
Protected proc.i
Protected buffer.s
GetWindowThreadProcessId_(Handle,@id)
proc = OpenProcess_(#PROCESS_VM_READ|#PROCESS_QUERY_INFORMATION,#False,id)
If proc
buffer = Space(#MAX_PATH)
If GetModuleFileNameExW(proc,#Null,@buffer,#MAX_PATH)
CloseHandle_(proc)
ProcedureReturn buffer
EndIf
CloseHandle_(proc)
EndIf
ProcedureReturn #Null$
EndProcedure
Re: Liste der Prozessnamen - unsichtbare Prozesse ausblenden
Verfasst: 08.02.2021 14:26
von Zerosurf
So, jetzt hab ich mich mal durch alle möglichen Code Schnipsel gekämpft und dabei folgendes zusammen gestellt:
Code: Alles auswählen
EnableExplicit
Define a, event
Global PID
Global MODULEENTRY32.MODULEENTRY32
Global Snapshot
Procedure ListWindows(hwnd,lParam)
Protected.s title = Space(1000),class = Space(1000)
If GetWindowLong_(hwnd,#GWL_EXSTYLE) ! #WS_EX_TOOLWINDOW And GetWindowLong_(hwnd,#GWL_STYLE) & #WS_VISIBLE
GetClassName_(hwnd,class,1000)
GetWindowText_(hwnd,title,1000)
If title <> ""
MODULEENTRY32\dwSize = SizeOf(MODULEENTRY32)
GetWindowThreadProcessId_(FindWindow_(0,title), @PID)
Snapshot = CreateToolhelp32Snapshot_(#TH32CS_SNAPMODULE, PID)
If Module32First_(Snapshot, MODULEENTRY32)
;Debug PeekS(@MODULEENTRY32\szExePath)
;Debug "Title: "+title+" | Class: "+class+" | Handle: "+Str(hwnd)+" | App: "+GetFilePart(PeekS(@MODULEENTRY32\szExePath))+" | Path: "+PeekS(@MODULEENTRY32\szExePath)
AddGadgetItem (0, -1, title+Chr(10)+class+Chr(10)+Str(hwnd)+Chr(10)+GetFilePart(PeekS(@MODULEENTRY32\szExePath))+Chr(10)+PeekS(@MODULEENTRY32\szExePath))
Define a
EndIf
CloseHandle_(Snapshot)
EndIf
EndIf
ProcedureReturn #True
EndProcedure
If OpenWindow(0, 0, 0, 1010, 200, "Process Info:", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ListIconGadget(0, 5, 5, 1000, 190, "Title", 200, #PB_ListIcon_FullRowSelect | #PB_ListIcon_AlwaysShowSelection | #PB_ListIcon_GridLines)
AddGadgetColumn(0, 1, "Class", 240)
AddGadgetColumn(0, 2, "Handle", 60)
AddGadgetColumn(0, 3, "Program", 200)
AddGadgetColumn(0, 4, "Path", 500)
EnumChildWindows_(FindWindow_("ToolbarWindow32",0),@ListWindows(),0)
;SetGadgetState(0, 0)
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Soweit läuft es wie gewünscht, aber wie kann ich jetzt jeden einzelnen Eintrag per rechten Mausclick in die Zwischenablage kopieren?
Re: Liste der Prozessnamen - unsichtbare Prozesse ausblenden
Verfasst: 08.02.2021 21:39
von Zerosurf
So - vielen Dank für eure Unterstützung - hab es jetzt geschafft!