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_()