Liste der Prozessnamen - unsichtbare Prozesse ausblenden?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Zerosurf
Beiträge: 131
Registriert: 11.10.2005 15:46

Liste der Prozessnamen - unsichtbare Prozesse ausblenden?

Beitrag 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
PureBasic 6.00 | Windows 10 pro (x64)
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Liste der Prozessnamen - unsichtbare Prozesse ausblenden

Beitrag von Mijikai »

Was für unsichtbare Prozesse?
Btw. der Code hat Fehler z.B. wird das Snapshot Handle nicht korrekt überprüft.
Benutzeravatar
Zerosurf
Beiträge: 131
Registriert: 11.10.2005 15:46

Re: Liste der Prozessnamen - unsichtbare Prozesse ausblenden

Beitrag 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.
PureBasic 6.00 | Windows 10 pro (x64)
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Liste der Prozessnamen - unsichtbare Prozesse ausblenden

Beitrag 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
Benutzeravatar
Zerosurf
Beiträge: 131
Registriert: 11.10.2005 15:46

Re: Liste der Prozessnamen - unsichtbare Prozesse ausblenden

Beitrag 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)
PureBasic 6.00 | Windows 10 pro (x64)
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Liste der Prozessnamen - unsichtbare Prozesse ausblenden

Beitrag 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
Benutzeravatar
Zerosurf
Beiträge: 131
Registriert: 11.10.2005 15:46

Re: Liste der Prozessnamen - unsichtbare Prozesse ausblenden

Beitrag von Zerosurf »

Wenn ich jetzt diesen Code verwende und mit

Code: Alles auswählen

Debug GetProcessNameByWindow(525972)
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...
PureBasic 6.00 | Windows 10 pro (x64)
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Liste der Prozessnamen - unsichtbare Prozesse ausblenden

Beitrag 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
Benutzeravatar
Zerosurf
Beiträge: 131
Registriert: 11.10.2005 15:46

Re: Liste der Prozessnamen - unsichtbare Prozesse ausblenden

Beitrag 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?
PureBasic 6.00 | Windows 10 pro (x64)
Benutzeravatar
Zerosurf
Beiträge: 131
Registriert: 11.10.2005 15:46

Re: Liste der Prozessnamen - unsichtbare Prozesse ausblenden

Beitrag von Zerosurf »

So - vielen Dank für eure Unterstützung - hab es jetzt geschafft!
PureBasic 6.00 | Windows 10 pro (x64)
Antworten