Italia
Fonte/ 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 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 ! )
 
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 potuto 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 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 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 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
 
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

vor 29 Tagen  
 



Zum Quelltext


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

11.180 Views

Untitledvor 0 min.
Manfred BareiVorgestern (09:00)
Gast.0815 vor 5 Tagen
RudiB. vor 23 Tagen
ByteAttack vor 24 Tagen
Di più...

Themeninformationen



Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


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