| |
|
|
Georg Teles | Einfaches Ermitteln uno Fensterhandle anhand des Prozessnamens o. PID
Declarar exe_$, hwnd_&
' de EXE-Namen Ventana-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
Parámetros prozess$
Declarar hcTH32S&, out#, pid&
Claro 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 Ventana voluntad durchgegangen a Treffer con el gesuchten PID gelandet se
' allerdings is lo el erste Treffer ! d.H. si EXE mehrfach se ejecuta, es dies el Ergebnis des ersten Treffers !
EnumWindows( ProcAddr( "winproc", 2 ), pid& )
EndIf
CloseHandle( hcTH32S& )
EndIf
Disponer out#
Volver 0
ENDPROC
' EnumWindowsProc
Proc winproc
Parámetros hWnd&, lParam&
Declarar lpdwProcessID&
Claro lpdwProcessID&
GetWindowThreadProcessId( hWnd&, addr( lpdwProcessID& ) )
Ifnot not( lpdwProcessID& = lparam& )
hwnd_& = hwnd&'----------------------------------------------| GLOBALE Variable « hwnd_& » !
volver 0
EndIf
volver 1
ENDPROC
' Hauptprogramm
CLS
exe2handle( exe_$ )
' Ventana-Handle & Ventana-Texto des gesuchten Prozesses
imprimir hwnd_&;" - ";GetText $( hwnd_& )
Waitinput
( Achtung, ausbaubar ! ) |
|
|
| |
|
|
|
Michael W. | Caso negativo 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 lo así ähnlich, fand Yo a wenig witzig. Daher auch así übernommen con el Referencia «( Achtung, ausbaubar ! )» ( oder sería Baustellenquellcode más passen )
No sicher si uno en Delphi lo mejor hacer podría aber hier el WinProc original
Quelle: [...] |
|
|
| |
|
|
|
| Achso, como voluntad 2 Dinge hecho - una vez el Returnwert gesetzt - tambor el not(resultado) conjunto y danach otra vez schauen si windowHandle gesetzt voluntad se. Aus Pascalsicht ergibts Sinn.
In C oder Java wäres sichtbarer...
result=ProcessID!=LParam
if (!resultado) ...
Aber auch en Delphi/Pascal puede ser wohl...
resultado:= processid<>Lparam
aber el saber Roland mejor. |
|
|
| |
|
|
|
RGH | Sí, auch como es Result para el Rückgabewert el Procedimiento. (Alternativ puede ser aber siempre todavía como früher a Turbo-Pascal-Veces en lugar de "Result" el Prozedurnamen escribir.)
Saludo 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,
el Variable Result es una Art Volver con el Diferencia, dass Pascal el Befehle a End; abarbeitet & WindowHandle es hier una Globale Variable |
|
|
| |
|
|
|
Georg Teles | Nabend,
arbeite gerade a una Tool, en el una Programa comenzó se (hier cmd.exe), benutzt y anschließend terminiert.
Um exakt el gestartete Programa para encontrar ergo danach dessen FensterHandle a steuern, sin en Findindow zuzugreifen (como cmd.exe sí mehrmals laufen kann y hiermit ausgeschlossen se, que un más cmd.exe Ventana gesteuert se), se el Función 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"
Declarar Command#,StartupInfo#,ProcessInfo#,ExitCode#
Declarar Terminate&,Start&,Programa$
Declarar lst&
Declarar fwnd&, pwnd&, phnd&, gpid&
Ventana 1280,0-1200,800
Programm$ = "cmd.exe"
phnd& = createProcessExe(Programa$)
Imprimir "Create Prozess: "+Str$(phnd&)+" (0 = Fehler; >0 = Prozess Handle)"
Imprimir
Sleep 500
fwnd& = FindWindow("C:\Windows\SYSTEM32\cmd.exe")
gpid& = GetProcessID(phnd&)
exe2whandle("cmd.exe")
Imprimir "Gesuchtes Hanlde (wahrscheinlich!):"
Imprimir "FindWindow / fwnd& (WindowHandle): ";Str$(fwnd&)
Imprimir
Imprimir "Ergebnis:"
Imprimir "createProzess / phnd& (Process Handle): ";Str$(phnd&)
Imprimir "createProzess / gpid& (ProcessID): ";Str$(gpid&)
Imprimir "createProzess / pwnd& (WindowHandle): ";Str$(pwnd&)
Imprimir
waitinput
Imprimir "Prozess final: "+Str$(KillProcess(phnd&))+" (1 = OK; 0 = Fehler)"
waitinput
Proc exe2whandle
Parámetros prozess$
Declarar hcTH32S&, out#, pid&
Claro 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 Ventana voluntad durchgegangen a Treffer con el gesuchten PID gelandet se
' allerdings is lo el erste Treffer ! d.H. si EXE mehrfach se ejecuta, es dies el Ergebnis des ersten Treffers !
EnumWindows(ProcAddr("winproc",2),pid&)
EndIf
CloseHandle(hcTH32S&)
EndIf
Disponer out#
Volver 0
ENDPROC
Proc winproc
Parámetros hWnd&, lParam&
Declarar lpdwProcessID&
Claro lpdwProcessID&
GetWindowThreadProcessId(hWnd&,addr(lpdwProcessID&))
If (lpdwProcessID& = lparam&)
If lpdwProcessID& = gpid&
AddStrings(lst&,Str$(hwnd&)+"|"+Str$(lpdwProcessID&))
pwnd& = hwnd&'----------------------------------------------| pwnd& es hier global !
volver 0
EndIf
EndIf
volver 1
ENDPROC
Proc createProcessExe
Parámetros command$
Declarar handle&
Dim Command#,(Len(command$)+1)
Dim StartupInfo#,68
Claro startupinfo#
Largo StartupInfo#,0=68
Dim ProcessInfo#,16
Claro ProcessInfo#
String Command#,0 = command$
CreateProcess(0,Command#,0,0,0,0,0,0,StartupInfo#,ProcessInfo#)
Let handle& = Largo(ProcessInfo#,0)
Disponer Command#
Disponer StartupInfo#
Disponer ProcessInfo#
Volver handle&
ENDPROC
Proc KillProcess
Parámetros hprocess&
Dim exitcode#,4
GetExitCodeProcess(hprocess&,exitcode#)
TerminateProcess(hprocess&,Largo(exitcode#,0))
Disponer exitcode#
ENDPROC
EDIT: Nah lo va doch einfacher con 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
Declarar lst&, Programa$
Declarar fwnd&, pwnd&, phnd&, gpid&
Ventana 1280,0-1200,800
Programm$ = "cmd.exe"
gpid& = WinExec(Programa$,1)
Imprimir "PID WinExec: "+Str$(gpid&)+" (0 = Fehler; >0 = PID)"
Imprimir
Sleep 100
fwnd& = FindWindow("C:\Windows\SYSTEM32\cmd.exe")
exe2whandle("cmd.exe")
Imprimir "Gesuchtes Hanlde (wahrscheinlich!):"
Imprimir "FindWindow / fwnd& (WindowHandle): ";Str$(fwnd&)
Imprimir
Imprimir "Ergebnis:"
Imprimir "createProzess / gpid& (ProcessID): ";Str$(gpid&)
Imprimir "createProzess / pwnd& (WindowHandle): ";Str$(pwnd&)
Imprimir
waitinput
Imprimir "Prozess final: "+Str$(Process("Kill", gpid&, 0))+" (1 = OK; 0 = Fehler)"
waitinput
Proc exe2whandle
Parámetros prozess$
Declarar hcTH32S&, out#, pid&
Claro 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 Ventana voluntad durchgegangen a Treffer con el gesuchten PID gelandet se
' allerdings is lo el erste Treffer ! d.H. si EXE mehrfach se ejecuta, es dies el Ergebnis des ersten Treffers !
EnumWindows(ProcAddr("winproc",2),pid&)
EndIf
CloseHandle(hcTH32S&)
EndIf
Disponer out#
Volver 0
ENDPROC
Proc winproc
Parámetros hWnd&, lParam&
Declarar lpdwProcessID&
Claro lpdwProcessID&
GetWindowThreadProcessId(hWnd&,addr(lpdwProcessID&))
If (lpdwProcessID& = lparam&)
If lpdwProcessID& = gpid&
AddStrings(lst&,Str$(hwnd&)+"|"+Str$(lpdwProcessID&))
pwnd& = hwnd&'----------------------------------------------| pwnd& es hier global !
volver 0
EndIf
EndIf
volver 1
ENDPROC
Grüße |
|
|
| |
|
|