| |
|
|
Georg Teles | Einfaches Ermitteln eines Fensterhandle anhand des Prozessnamens bzw. PID
Declare exe_$, hwnd_&
' aus EXE-Namen Fenster-Handle ermittlen
exe_$ = SubStr$( Par$( 0 ), -1, "\\" )
'exe_$ = "irgendeine.exe"
' DEF
Def CreateToolhelp32Snapshot(2) ! "Kernel32", "CreateToolhelp32Snapshot"
Def Process32First(2) ! "Kernel32", "Process32First"
Def Process32Next(2) ! "Kernel32", "Process32Next"
Def CloseHandle(1) ! "Kernel32", "CloseHandle"
Def EnumWindows(2) ! "User32", "EnumWindows"
Def GetWindowThreadProcessId(2) ! "User32", "GetWindowThreadProcessId"
' Konstante
Def &TH32CS_SNAPPROCESS $2
'
Proc exe2handle
Parameters prozess$
Declare hcTH32S&, out#, pid&
Clear pid&
Struct PROCESSENTRY32 = dwSize&, cntUsage&, th32ProcessID&, th32DefaultHeapID&, th32ModuleID&, Threads&, th32ParentProcessID&, pcPriClassBase&, dwFlags&, szExeFile$( 260 )
Dim out#, PROCESSENTRY32
out#.dwSize& = SizeOf( out# )
hcTH32S& = CreateToolhelp32Snapshot( &TH32CS_SNAPPROCESS, 0 )
If hcTH32S&
If Process32First( hcTH32S&, out# )
Repeat
If Lower$( out#.szExeFile$ ) = Lower$( prozess$ )
' PID vom EXE-Namen auslesen
pid& = out#.th32ProcessID&
EndIf
Until ( pid& = not( 0 ) ) | ( Process32Next( hcTH32S&, out# ) = 0 )
' Alle Fenster werden durchgegangen bis Treffer mit der gesuchten PID gelandet wird
' allerdings is es der erste Treffer ! d.H. wenn EXE mehrfach corre, ist dies das Ergebnis des ersten Treffers !
EnumWindows( ProcAddr( "winproc", 2 ), pid& )
EndIf
CloseHandle( hcTH32S& )
EndIf
Dispose out#
Return 0
EndProc
' EnumWindowsProc
Proc winproc
Parameters hWnd&, lParam&
Declare lpdwProcessID&
Clear lpdwProcessID&
GetWindowThreadProcessId( hWnd&, addr( lpdwProcessID& ) )
Ifnot not( lpdwProcessID& = lparam& )
hwnd_& = hwnd&'----------------------------------------------| GLOBALE Variable « hwnd_& » !
return 0
EndIf
return 1
EndProc
' Hauptprogramm
CLS
exe2handle( exe_$ )
' Fenster-Handle & Fenster-Text des gesuchten Prozesses
print hwnd_&;" - ";GetText$( hwnd_& )
Waitinput
( Achtung, ausbaubar ! ) |
|
|
| |
|
|
|
Michael W. | IfNot Not() |
|
|
| XProfan X3System: Windows 8/10, XProfan X4 Programmieren, das spannendste Detektivspiel der Welt. | 14.01.2015 ▲ |
|
|
|
|
| |
|
| |
|
|
|
Georg Teles | Ganz genau. Im original Quellcode ( Delphi ) stand es so ähnlich, fand ich a wenig witzig. Daher auch so übernommen mit dem Hinweis «( Achtung, ausbaubar ! )» ( oder würde Baustellenquellcode eher passen )
Nicht sicher ob man in Delphi es besser machen potuto aber hier die WinProc original
Quelle: [...] |
|
|
| |
|
|
|
| Achso, da werden 2 Dinge erledigt - einmal der Returnwert gesetzt - drum das not(result) setzen und danach nochmal schauen ob windowHandle gesetzt werden soll. Aus Pascalsicht ergibts Sinn.
In C oder Java wäres sichtbarer...
result=ProcessID!=LParam
if (!result) ...
Aber auch in Delphi/Pascal kann man wohl...
result:= processid<>Lparam
aber das wüsste Roland besser. |
|
|
| |
|
|
|
RGH | Ja, auch da steht Result per den Rückgabewert der Prozedur. (Alternativ kann man aber immer noch wie früher zu Turbo-Pascal-Zeiten statt "Result" den Prozedurnamen schreiben.)
Saluto Roland |
|
|
| XProfan X2Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 14.01.2015 ▲ |
|
|
|
|
Georg Teles | Aah verstehe,
die Variable Result ist eine Art Return mit dem Unterschied, dass Pascal die Befehle bis End; abarbeitet & WindowHandle ist hier eine Globale Variable |
|
|
| |
|
|
|
Georg Teles | Nabend,
arbeite gerade an einem Tool, bei dem ein Programm gestartet wird (hier cmd.exe), benutzt und anschließend terminiert.
Um exakt das gestartete Programm zu finden ergo danach dessen FensterHandle zu steuern, ohne auf Findindow zuzugreifen (da cmd.exe ja mehrmals laufen kann und hiermit ausgeschlossen wird, dass ein anderes cmd.exe Fenster gesteuert wird), wird die Funktion WinProc benutzt.
Def CreateToolhelp32Snapshot(2) ! "KERNEL32", "CreateToolhelp32Snapshot"
Def Process32First(2) ! "KERNEL32", "Process32First"
Def Process32Next(2) ! "KERNEL32", "Process32Next"
Def CloseHandle(1) ! "KERNEL32", "CloseHandle"
Def EnumWindows(2) ! "USER32", "EnumWindows"
Def GetWindowThreadProcessId(2) ! "USER32", "GetWindowThreadProcessId"
Def &TH32CS_SNAPPROCESS $2
Def GetProcessId(1) ! "KERNEL32", "GetProcessId"
Def CreateProcess(10) ! "KERNEL32","CreateProcessA"
Def GetExitCodeProcess(2) ! "KERNEL32","GetExitCodeProcess"
Def TerminateProcess(2) ! "KERNEL32","TerminateProcess"
Declare Command#,StartupInfo#,ProcessInfo#,ExitCode#
Declare Terminate&,Start&,Programm$
Declare lst&
Declare fwnd&, pwnd&, phnd&, gpid&
Window 1280,0-1200,800
Programm$ = "cmd.exe"
phnd& = createProcessExe(Programm$)
Print "Create Prozess: "+Str$(phnd&)+" (0 = Fehler; >0 = Prozess Handle)"
Print
Sleep 500
fwnd& = FindWindow("C:\Windows\SYSTEM32\cmd.exe")
gpid& = GetProcessID(phnd&)
exe2whandle("cmd.exe")
Print "Gesuchtes Hanlde (wahrscheinlich!):"
Print "FindWindow / fwnd& (WindowHandle): ";Str$(fwnd&)
Print
Print "Ergebnis:"
Print "createProzess / phnd& (Process Handle): ";Str$(phnd&)
Print "createProzess / gpid& (ProcessID): ";Str$(gpid&)
Print "createProzess / pwnd& (WindowHandle): ";Str$(pwnd&)
Print
waitinput
Print "Prozess beendet: "+Str$(KillProcess(phnd&))+" (1 = OK; 0 = Fehler)"
waitinput
Proc exe2whandle
Parameters prozess$
Declare hcTH32S&, out#, pid&
Clear pid&
Struct PROCESSENTRY32 = dwSize&, cntUsage&, th32ProcessID&, th32DefaultHeapID&, th32ModuleID&, Threads&, th32ParentProcessID&, pcPriClassBase&, dwFlags&, szExeFile$( 260 )
Dim out#, PROCESSENTRY32
out#.dwSize& = SizeOf(out#)
hcTH32S& = CreateToolhelp32Snapshot(&TH32CS_SNAPPROCESS,0)
If hcTH32S&
If Process32First(hcTH32S&,out#)
Repeat
If Lower$(out#.szExeFile$) = Lower$(prozess$)
' PID vom EXE-Namen auslesen
pid& = out#.th32ProcessID&
EndIf
Until (pid& = not(0)) | (Process32Next(hcTH32S&,out#)=0)
' Alle Fenster werden durchgegangen bis Treffer mit der gesuchten PID gelandet wird
' allerdings is es der erste Treffer ! d.H. wenn EXE mehrfach corre, ist dies das Ergebnis des ersten Treffers !
EnumWindows(ProcAddr("winproc",2),pid&)
EndIf
CloseHandle(hcTH32S&)
EndIf
Dispose out#
Return 0
EndProc
Proc winproc
Parameters hWnd&, lParam&
Declare lpdwProcessID&
Clear lpdwProcessID&
GetWindowThreadProcessId(hWnd&,addr(lpdwProcessID&))
If (lpdwProcessID& = lparam&)
If lpdwProcessID& = gpid&
AddString(lst&,Str$(hwnd&)+"|"+Str$(lpdwProcessID&))
pwnd& = hwnd&'----------------------------------------------| pwnd& ist hier global !
return 0
EndIf
EndIf
return 1
EndProc
Proc createProcessExe
Parameters command$
Declare handle&
Dim Command#,(Len(command$)+1)
Dim StartupInfo#,68
Clear startupinfo#
Long StartupInfo#,0=68
Dim ProcessInfo#,16
Clear ProcessInfo#
String Command#,0 = command$
CreateProcess(0,Command#,0,0,0,0,0,0,StartupInfo#,ProcessInfo#)
Let handle& = Long(ProcessInfo#,0)
Dispose Command#
Dispose StartupInfo#
Dispose ProcessInfo#
Return handle&
EndProc
Proc KillProcess
Parameters hprocess&
Dim exitcode#,4
GetExitCodeProcess(hprocess&,exitcode#)
TerminateProcess(hprocess&,Long(exitcode#,0))
Dispose exitcode#
EndProc
EDIT: Nah es geht doch einfacher mit WinExec
Def CreateToolhelp32Snapshot(2) ! "KERNEL32", "CreateToolhelp32Snapshot"
Def Process32First(2) ! "KERNEL32", "Process32First"
Def Process32Next(2) ! "KERNEL32", "Process32Next"
Def CloseHandle(1) ! "KERNEL32", "CloseHandle"
Def EnumWindows(2) ! "USER32", "EnumWindows"
Def GetWindowThreadProcessId(2) ! "USER32", "GetWindowThreadProcessId"
Def &TH32CS_SNAPPROCESS $2
Declare lst&, Programm$
Declare fwnd&, pwnd&, phnd&, gpid&
Window 1280,0-1200,800
Programm$ = "cmd.exe"
gpid& = WinExec(Programm$,1)
Print "PID WinExec: "+Str$(gpid&)+" (0 = Fehler; >0 = PID)"
Print
Sleep 100
fwnd& = FindWindow("C:\Windows\SYSTEM32\cmd.exe")
exe2whandle("cmd.exe")
Print "Gesuchtes Hanlde (wahrscheinlich!):"
Print "FindWindow / fwnd& (WindowHandle): ";Str$(fwnd&)
Print
Print "Ergebnis:"
Print "createProzess / gpid& (ProcessID): ";Str$(gpid&)
Print "createProzess / pwnd& (WindowHandle): ";Str$(pwnd&)
Print
waitinput
Print "Prozess beendet: "+Str$(Process("Kill", gpid&, 0))+" (1 = OK; 0 = Fehler)"
waitinput
Proc exe2whandle
Parameters prozess$
Declare hcTH32S&, out#, pid&
Clear pid&
Struct PROCESSENTRY32 = dwSize&, cntUsage&, th32ProcessID&, th32DefaultHeapID&, th32ModuleID&, Threads&, th32ParentProcessID&, pcPriClassBase&, dwFlags&, szExeFile$( 260 )
Dim out#, PROCESSENTRY32
out#.dwSize& = SizeOf(out#)
hcTH32S& = CreateToolhelp32Snapshot(&TH32CS_SNAPPROCESS,0)
If hcTH32S&
If Process32First(hcTH32S&,out#)
Repeat
If Lower$(out#.szExeFile$) = Lower$(prozess$)
' PID vom EXE-Namen auslesen
pid& = out#.th32ProcessID&
EndIf
Until (pid& = not(0)) | (Process32Next(hcTH32S&,out#)=0)
' Alle Fenster werden durchgegangen bis Treffer mit der gesuchten PID gelandet wird
' allerdings is es der erste Treffer ! d.H. wenn EXE mehrfach corre, ist dies das Ergebnis des ersten Treffers !
EnumWindows(ProcAddr("winproc",2),pid&)
EndIf
CloseHandle(hcTH32S&)
EndIf
Dispose out#
Return 0
EndProc
Proc winproc
Parameters hWnd&, lParam&
Declare lpdwProcessID&
Clear lpdwProcessID&
GetWindowThreadProcessId(hWnd&,addr(lpdwProcessID&))
If (lpdwProcessID& = lparam&)
If lpdwProcessID& = gpid&
AddString(lst&,Str$(hwnd&)+"|"+Str$(lpdwProcessID&))
pwnd& = hwnd&'----------------------------------------------| pwnd& ist hier global !
return 0
EndIf
EndIf
return 1
EndProc
Grüße |
|
|
| |
|
|