Deutsch
Quelltexte/ Codesnippets

Fensterhandle Prozessname

 

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 läuft, 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 ! )
 
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

14.01.2015  
 




Michael
W.
IfNot Not()
 
XProfan X3
System: Windows 8/10, XProfan X4
Programmieren, das spannendste Detektivspiel der Welt.
14.01.2015  
 



Michael W. (14.01.15)
IfNot Not()


Sogar:

Ifnot not( lpdwProcessID& = lparam& )

ergo schon in der Klammer ausgewertet, dann per not obs 0 ist, dann wenns 0 ist, nicht.

Von der Logik her gibts da wohl aber nichts dran auszusetzen, ist halt scharf formuliert.

Der Rechner hätte jedenfalls mit

If lpdwProcessID& = lparam&

weniger zu tun. ^^
 
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 könnte aber hier die WinProc original

Quelle: [...] 
 
XProfan X2
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

14.01.2015  
 



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.
 
14.01.2015  
 




RGH
Ja, auch da steht Result für den Rückgabewert der Prozedur. (Alternativ kann man aber immer noch wie früher zu Turbo-Pascal-Zeiten statt "Result" den Prozedurnamen schreiben.)

Gruß
Roland
 
XProfan X2
Intel 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
 
XProfan X2
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

14.01.2015  
 




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 läuft, 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 läuft, 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
 
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

27.10.2024  
 



Zum Quelltext


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

11.295 Betrachtungen

Unbenanntvor 0 min.
Georg Teles vor 12 Tagen
Paul Glatz vor 19 Tagen
Walter vor 24 Tagen
R.Schneider vor 27 Tagen
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie