| |
|
|
Georg Teles | Einfaches Ermitteln eines Fensterhandle anhand des Prozessnamens bzw. PID
Déclarer exe_$, hwnd_&
' aus EXE-Namen la fenêtre-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
Paramètres prozess$
Déclarer hcTH32S&, out#, pid&
Claire pid&
Struct PROCESSENTRY32 = dwSize&, cntUsage&, th32ProcessID&, th32DefaultHeapID&, th32ModuleID&, Threads&, th32ParentProcessID&, pcPriClassBase&, dwFlags&, szExeFile$( 260 )
Faible out#, PROCESSENTRY32
out#.dwSize& = SizeOf( out# )
hcTH32S& = CreateToolhelp32Snapshot( &TH32CS_SNAPPROCESS, 0 )
Si hcTH32S&
Si Process32First( hcTH32S&, out# )
Repeat
Si Lower$( out#.szExeFile$ ) = Lower$( prozess$ )
' PID vom EXE-Namen auslesen
pid& = out#.th32ProcessID&
EndIf
Until ( pid& = not( 0 ) ) | ( Process32Next( hcTH32S&, out# ) = 0 )
' Alle la fenêtre volonté durchgegangen jusqu'à Treffer avec qui gesuchten PID gelandet wird
' allerdings is es qui erste Treffer ! d.H. si EXE mehrfach fonctionne, ist ca cela Ergebnis des ersten Treffers !
EnumWindows( ProcAddr( "winproc", 2 ), pid& )
EndIf
CloseHandle( hcTH32S& )
EndIf
Dispose out#
Retour 0
ENDPROC
' EnumWindowsProc
Proc winproc
Paramètres hWnd&, lParam&
Déclarer lpdwProcessID&
Claire lpdwProcessID&
GetWindowThreadProcessId( hWnd&, addr( lpdwProcessID& ) )
Ifnot not( lpdwProcessID& = lparam& )
hwnd_& = hwnd&'----------------------------------------------| GLOBALE Variable « hwnd_& » !
return 0
EndIf
return 1
ENDPROC
' Hauptprogramm
CLS
exe2handle( exe_$ )
' la fenêtre-Handle & la fenêtre-Text des gesuchten Prozesses
imprimer hwnd_&;" - ";GetText $( hwnd_& )
Waitinput
( attention, ausbaubar ! ) |
|
|
| |
|
|
|
Michael W. | Si non Not() |
|
|
| XProfan X3System: Windows 8/10, XProfan X4 Programmieren, das spannendste Detektivspiel der Welt. | 14.01.2015 ▲ |
|
|
|
|
| |
|
| |
|
|
|
Georg Teles | entier oui c'est ca. Im original Quellcode ( Delphi ) stand es so ähnlich, fand je a wenig witzig. Daher aussi so übernommen avec dem Hinweis «( attention, ausbaubar ! )» ( ou bien serait Baustellenquellcode plutôt passen )
pas sûrement si on dans Delphi es besser faire pourrait mais ici qui WinProc original
source: [...] |
|
|
| |
|
|
|
| Achso, là volonté 2 Dinge erledigt - einmal qui Returnwert gesetzt - tambour cela not(result) mettons et après nochmal regarder si windowHandle gesetzt volonté soll. Aus Pascalsicht ergibts Sinn.
dans C ou bien Java wäres sichtbarer...
result=ProcessID!=LParam
si (!result) ...
mais aussi dans Delphi/Pascal peux on wohl...
result:= processid<>Lparam
mais cela wüsste Roland besser. |
|
|
| |
|
|
|
RGH | oui, aussi là steht Result pour den Rückgabewert qui Procédure. (Alternativ peux on mais toujours comment früher trop Turbo-Pascal-Zeiten statt "Result" den Prozedurnamen écrivons.)
Salut 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,
qui Variable Result ist une Art Retour avec dem Unterschied, dass Pascal qui Befehle jusqu'à End; abarbeitet & WindowHandle ist ici une Globale Variable |
|
|
| |
|
|
|
Georg Teles | Nabend,
arbeite justement à einem Tool, chez dem un Programme gestartet wird (ici cmd.exe), benutzt et anschließend terminiert.
Um exakt cela gestartete Programme pour trouver ergo après dessen FensterHandle trop steuern, sans sur Findindow zuzugreifen (là cmd.exe oui plusieurs fois courir peux et hiermit ausgeschlossen wird, dass un d'autre cmd.exe la fenêtre gesteuert wird), wird qui 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"
Déclarer Command#,StartupInfo#,ProcessInfo#,ExitCode#
Déclarer Terminate&,Start&,Programme$
Déclarer lst&
Déclarer fwnd&, pwnd&, phnd&, gpid&
Fenêtre 1280,0-1200,800
Programm$ = "cmd.exe"
phnd& = createProcessExe(Programme$)
Imprimer "Create Prozess: "+Str$(phnd&)+" (0 = Fehler; >0 = Prozess Handle)"
Imprimer
Sleep 500
fwnd& = FindWindow("C:\Windows\SYSTEM32\cmd.exe")
gpid& = GetProcessID(phnd&)
exe2whandle("cmd.exe")
Imprimer "Gesuchtes Hanlde (wahrscheinlich!):"
Imprimer "FindWindow / fwnd& (WindowHandle): ";Str$(fwnd&)
Imprimer
Imprimer "Ergebnis:"
Imprimer "createProzess / phnd& (Process Handle): ";Str$(phnd&)
Imprimer "createProzess / gpid& (ProcessID): ";Str$(gpid&)
Imprimer "createProzess / pwnd& (WindowHandle): ";Str$(pwnd&)
Imprimer
waitinput
Imprimer "Prozess finissez: "+Str$(KillProcess(phnd&))+" (1 = OK; 0 = faute)"
waitinput
Proc exe2whandle
Paramètres prozess$
Déclarer hcTH32S&, out#, pid&
Claire pid&
Struct PROCESSENTRY32 = dwSize&, cntUsage&, th32ProcessID&, th32DefaultHeapID&, th32ModuleID&, Threads&, th32ParentProcessID&, pcPriClassBase&, dwFlags&, szExeFile$( 260 )
Faible out#, PROCESSENTRY32
out#.dwSize& = SizeOf(out#)
hcTH32S& = CreateToolhelp32Snapshot(&TH32CS_SNAPPROCESS,0)
Si hcTH32S&
Si Process32First(hcTH32S&,out#)
Repeat
Si Lower$(out#.szExeFile$) = Lower$(prozess$)
' PID vom EXE-Namen auslesen
pid& = out#.th32ProcessID&
EndIf
Until (pid& = not(0)) | (Process32Next(hcTH32S&,out#)=0)
' Alle la fenêtre volonté durchgegangen jusqu'à Treffer avec qui gesuchten PID gelandet wird
' allerdings is es qui erste Treffer ! d.H. si EXE mehrfach fonctionne, ist ca cela Ergebnis des ersten Treffers !
EnumWindows(ProcAddr("winproc",2),pid&)
EndIf
CloseHandle(hcTH32S&)
EndIf
Dispose out#
Retour 0
ENDPROC
Proc winproc
Paramètres hWnd&, lParam&
Déclarer lpdwProcessID&
Claire lpdwProcessID&
GetWindowThreadProcessId(hWnd&,addr(lpdwProcessID&))
Si (lpdwProcessID& = lparam&)
Si lpdwProcessID& = gpid&
AddStrings(lst&,Str$(hwnd&)+"|"+Str$(lpdwProcessID&))
pwnd& = hwnd&'----------------------------------------------| pwnd& ist ici global !
return 0
EndIf
EndIf
return 1
ENDPROC
Proc createProcessExe
Paramètres command$
Déclarer handle&
Faible Command#,(Len(command$)+1)
Faible StartupInfo#,68
Claire startupinfo#
Long StartupInfo#,0=68
Faible ProcessInfo#,16
Claire ProcessInfo#
String Command#,0 = command$
CreateProcess(0,Command#,0,0,0,0,0,0,StartupInfo#,ProcessInfo#)
Laisser handle& = Long(ProcessInfo#,0)
Dispose Command#
Dispose StartupInfo#
Dispose ProcessInfo#
Retour handle&
ENDPROC
Proc KillProcess
Paramètres hprocess&
Faible exitcode#,4
GetExitCodeProcess(hprocess&,exitcode#)
TerminateProcess(hprocess&,Long(exitcode#,0))
Dispose exitcode#
ENDPROC
EDIT: près und dir doch einfacher avec 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
Déclarer lst&, Programme$
Déclarer fwnd&, pwnd&, phnd&, gpid&
Fenêtre 1280,0-1200,800
Programm$ = "cmd.exe"
gpid& = WinExec(Programme$,1)
Imprimer "PID WinExec: "+Str$(gpid&)+" (0 = Fehler; >0 = PID)"
Imprimer
Sleep 100
fwnd& = FindWindow("C:\Windows\SYSTEM32\cmd.exe")
exe2whandle("cmd.exe")
Imprimer "Gesuchtes Hanlde (wahrscheinlich!):"
Imprimer "FindWindow / fwnd& (WindowHandle): ";Str$(fwnd&)
Imprimer
Imprimer "Ergebnis:"
Imprimer "createProzess / gpid& (ProcessID): ";Str$(gpid&)
Imprimer "createProzess / pwnd& (WindowHandle): ";Str$(pwnd&)
Imprimer
waitinput
Imprimer "Prozess finissez: "+Str$(Process("Kill", gpid&, 0))+" (1 = OK; 0 = faute)"
waitinput
Proc exe2whandle
Paramètres prozess$
Déclarer hcTH32S&, out#, pid&
Claire pid&
Struct PROCESSENTRY32 = dwSize&, cntUsage&, th32ProcessID&, th32DefaultHeapID&, th32ModuleID&, Threads&, th32ParentProcessID&, pcPriClassBase&, dwFlags&, szExeFile$( 260 )
Faible out#, PROCESSENTRY32
out#.dwSize& = SizeOf(out#)
hcTH32S& = CreateToolhelp32Snapshot(&TH32CS_SNAPPROCESS,0)
Si hcTH32S&
Si Process32First(hcTH32S&,out#)
Repeat
Si Lower$(out#.szExeFile$) = Lower$(prozess$)
' PID vom EXE-Namen auslesen
pid& = out#.th32ProcessID&
EndIf
Until (pid& = not(0)) | (Process32Next(hcTH32S&,out#)=0)
' Alle la fenêtre volonté durchgegangen jusqu'à Treffer avec qui gesuchten PID gelandet wird
' allerdings is es qui erste Treffer ! d.H. si EXE mehrfach fonctionne, ist ca cela Ergebnis des ersten Treffers !
EnumWindows(ProcAddr("winproc",2),pid&)
EndIf
CloseHandle(hcTH32S&)
EndIf
Dispose out#
Retour 0
ENDPROC
Proc winproc
Paramètres hWnd&, lParam&
Déclarer lpdwProcessID&
Claire lpdwProcessID&
GetWindowThreadProcessId(hWnd&,addr(lpdwProcessID&))
Si (lpdwProcessID& = lparam&)
Si lpdwProcessID& = gpid&
AddStrings(lst&,Str$(hwnd&)+"|"+Str$(lpdwProcessID&))
pwnd& = hwnd&'----------------------------------------------| pwnd& ist ici global !
return 0
EndIf
EndIf
return 1
ENDPROC
Grüße |
|
|
| |
|
|