Prozessh eines mit shellexec gestarteten Programs ermitteln

Für allgemeine Fragen zur Programmierung mit PureBasic.
3dhubiflieger
Beiträge: 123
Registriert: 27.10.2013 12:13

Prozessh eines mit shellexec gestarteten Programs ermitteln

Beitrag von 3dhubiflieger »

Hallo, ich habe ein Problem. Und zwar möchte ich ein Programm mit Shellexecute und #sw_hide starten (Code unten) ...Dummerweise weiss ich aber das Fensterhandle nicht nachdem das Programm gestartet wurde, da ja nix zurück gegeben wird ! Wie komm ich da dran ? Ich brauche das Fenster welches normalerweise sichtbar ist, wenn das Programm auf normale Art und weise startet !

Code: Alles auswählen

ShellExecute_(#Null,"open",Mediacenterpfad$,Parameter$,GetPathPart(Mediacenterpfad$),#SW_Hide)   
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Prozessh eines mit shellexec gestarteten Programs ermitt

Beitrag von RSBasic »

Wenn du den Titel oder Klassennamen kennst, kannst du die Handle-Nummer mit FindWindow_() oder am besten mit EnumWindows_() ermitteln.
Was auch möglich ist: http://www.rsbasic.de/aktualisierung/wi ... mitteln.pb (klappt aber nicht mit jeder Anwendung)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
3dhubiflieger
Beiträge: 123
Registriert: 27.10.2013 12:13

Re: Prozessh eines mit shellexec gestarteten Programs ermitt

Beitrag von 3dhubiflieger »

Hey Danke RS Basic ! Nach langem hin und her probieren, hab ich mir den Code zusammengefriemelt. Die Processpathidprozedure hatte ich schon. Ich habe das ganze so wie Du vorgeschlagen hast mit enumwindows gelöst. Der Vorteil dieser Methode ist, das der Code kompakt und schnell ist. Und selbst wenn ich das Programm mit verstecktem Fenster starte und der Titel des Programms nicht bekannt ist, wird das Handle korrekt ermittelt ! :) Mir gefällt allerdings das Global im Code nicht. Gibt es da eine Lösung ? Ich werd jetzt das ganze mal in mein Programm einbaun und weiter testen.

Code: Alles auswählen

Procedure ProcessPathID(PName$)
  
  Protected Snapshot, Snapshot2, ProcessFound
  Protected Process.PROCESSENTRY32, Module.MODULEENTRY32
 


  Process\dwSize = SizeOf(PROCESSENTRY32)
  Module\dwSize  = SizeOf(MODULEENTRY32)
  
  PName$ = UCase(PName$)
  
  Snapshot = CreateToolhelp32Snapshot_(#TH32CS_SNAPPROCESS, 0)
  If Snapshot
    ProcessFound = Process32First_(Snapshot, Process)
    While ProcessFound
    
      Snapshot2 = CreateToolhelp32Snapshot_(#TH32CS_SNAPMODULE,Process\th32ProcessID)
      If Snapshot2 
        If Module32First_(Snapshot2, @Module)
        
          If UCase(PName$) = UCase(PeekS(@Module\szExePath[0]))
            CloseHandle_(Snapshot)
            CloseHandle_(Snapshot2)
            ProcedureReturn Process\th32ProcessID
          EndIf
     
          CloseHandle_(Snapshot2)
        EndIf  
      EndIf
     
      ProcessFound = Process32Next_(Snapshot, Process)
    Wend
   
    CloseHandle_(Snapshot)
  EndIf
 ProcedureReturn 0
EndProcedure





Global Enumhandle

Procedure EnumWindows(hwnd,lParam)
  GetWindowThreadProcessId_(hwnd, @ProcTaskID)
  If lparam = ProcTaskID
   Enumhandle = hwnd
  EndIf 
  ProcedureReturn #True
EndProcedure


Procedure GetTopHandle(PID)
  EnumWindows_(@EnumWindows(),PID)
  ProcedureReturn Enumhandle
EndProcedure


Debug gettophandle(ProcessPathID("c:\windows\notepad.exe"))
End



Benutzeravatar
_JON_
Beiträge: 389
Registriert: 30.03.2010 15:24

Re: Prozessh eines mit shellexec gestarteten Programs ermitt

Beitrag von _JON_ »

Wenn dich das Global stört nimm doch eine Struktur als 2. Parameter für EnumWindows_()
PureBasic 5.46 LTS (Windows x86/x64) | windows 10 x64 Oktober failure
Antworten