Seite 1 von 1

Prozessh eines mit shellexec gestarteten Programs ermitteln

Verfasst: 24.08.2015 22:06
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)   

Re: Prozessh eines mit shellexec gestarteten Programs ermitt

Verfasst: 24.08.2015 22:12
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)

Re: Prozessh eines mit shellexec gestarteten Programs ermitt

Verfasst: 25.08.2015 18:49
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




Re: Prozessh eines mit shellexec gestarteten Programs ermitt

Verfasst: 25.08.2015 19:50
von _JON_
Wenn dich das Global stört nimm doch eine Struktur als 2. Parameter für EnumWindows_()