Fremde Anwendung steuern



  • Hallo Forum,

    ich möchte ein fremde Anwendung steuern. Ich habe es PostMessage versucht. Mir gelingt es aber nicht zwischen den Tabs hin und her zu springen. Dies funktioniert nicht:
    PostMessage(hwnd, WM_KEYDOWN, VK_DOWN, 0);

    Wie muß ich es stattdessen machen?

    Vielen Dank

    Peter



  • Für soche Themen gibt es bestimmt schon viel BSP Source im Inet. Wie würdet Ihr "fremde anwendung steuern" übersetzen?



  • wenn es denn so funktionieren würde müsstest du dir schon ein handle auf die entsprechende anwendung holen aber ich mach dir nciht viel hoffung das es so klappt



  • Den Handle habe ich schon:

    Private Sub Command1_Click()
        Dim hwnd As Long
    
        hwnd = ShellTohWnd(App.Path & "\MyTool.exe", vbNormalNoFocus)  ' vbHide) 
        Call PostMessage(hwnd, WM_KEYDOWN, VK_RETURN, 0) ' Funktioniert
        Call PostMessage(hwnd, WM_KEYDOWN, VK_DOWN, 0) ' Funktioniert NICHT
        Call PostMessage(hwnd, WM_KEYDOWN, VK_SPACE, 0) ' Funktioniert NICHT
    End Sub
    
    Private Function ShellTohWnd(ByVal hhwPfad As String, Optional Mode As VbAppWinStyle)
        Dim ProcHWND As Long, ProcHWN As Long
    
        ProcHWND = Shell(hhwPfad, Mode)
    
        Retval = FindWindow(vbNullString, vbNullString)
        Do While Retval <> 0
            If GetParent(Retval) = 0 Then
                Call GetWindowThreadProcessId(Retval, ProcHWN)
    
                If ProcHWN = ProcHWND Then
                    ShellTohWnd = Retval
                    Exit Do
                End If
            End If
    
            Retval = GetWindow(Retval, GW_HWNDNEXT)
        Loop
    End Function
    

    Ich kann die Anwendung versteckt starten und jeweils ENTER an das Fenster senden. Sende ich aber einen VK_TAB (oder VK_DOWN) wird nicht zum nächsten Control gesprungen. Das liegt vermutlich daran das die fremde Applikation nicht den Fokus hat. Ich müsste also direkt zu einem bestimmten Control im Fenster springen. Wie macht man das?

    Wenn auf einem Fenster 10 Textboxen sind, wie werden die dann unterschieden? Durch den WindowHandle. Der ist doch aber jedes mal anders. Ich muß also nach einem anderem Kriterium die "richtige" Textbox auswählen und dann anhand dessen den hWnd in Erfahrung bringen. Welches wäre das Kriterium?

    Vielen Dank

    Peter



  • Ähm Dir ist aber schon klar, dass das ein C++ und kein VB-Forum ist, nech 😉 ?

    Vllt hilft Dir aber SetFocus ?!

    PS: Vllt ist das noch interessant: http://www.c-plusplus.net/forum/viewtopic-var-t-is-165868.html



  • Ehhhmm das is irgendwie VB und nicht C++.



  • Achja: An die Handle der Child-Window kommst Du entweder mit EnumChildWindows oder mit FindWindowEx 😉 .



  • Laut dem Text geht der Tip aus der Ansi FAQ nicht, weil das Fenster nicht den Fokus hat. Kann ich einem verstecktem nicht sichtbarem Fenster den Fokus geben? Ich glaube eher nicht. Es würde doch reichen an das Control eine Nachricht zu schicken. Nehmen wir an ich komme über EnumChildWindows an das OptionsControl heran das ich setzen will. Dann müsste ich nur noch eine Message SETZEN senden. So sollte es gehen?



  • peterfarge schrieb:

    Wenn auf einem Fenster 10 Textboxen sind, wie werden die dann unterschieden? Durch den WindowHandle...

    ... und durch eine ID, falls der Programmierer von "MyTool.exe" welche vergeben hat. Mit "GetDlgCtrlID ()" lässt sie sich ermitteln.
    Die ID's sind, sofern vergeben, bei jedem Start von "MyTool.exe" gleich.
    Wenn Du die ID's einmal ermittelt hast, kannst Du sie in Deinem Steuerungsprogramm direkt verwenden, z.B. via "SendDlgItemMessage ()".
    ( -> wobei mit "handle of dialog box" immer das Handle vom Parent des Controls gemeint ist <-)
    Allerdings kann sich der Programmierer auch einen Scherz erlaubt haben und hat nicht ein-eindeutige ID's vergeben. Dann bleibt nur das "WindowHandle".

    peterfarge schrieb:

    Es würde doch reichen an das Control eine Nachricht zu schicken.

    Das reicht auch. Der Fokus ist nur für das Betriebssystem interessant, damit es weiss, an wen es z.B. direkte Keyboardeingaben senden soll.
    Eine Anwendung kann jederzeit, d.h. unabhängig vom Fokus Botschaften empfangen und verarbeiten.



  • Hallo Merker,

    vielen Dank für Bestätigung. 🙂
    So kann ich mit der Gewissheit loslegen das es funktionieren wird.

    Peter



  • peterfarge schrieb:

    Dann müsste ich nur noch eine Message SETZEN senden. So sollte es gehen?

    Jupp, sozusagen, dachte erst es ging um Tastatureingaben, Du willst Befehle senden ⚠ .

    merker schrieb:

    Allerdings kann sich der Programmierer auch einen Scherz erlaubt haben und hat nicht ein-eindeutige ID's vergeben. Dann bleibt nur das "WindowHandle".

    lol, Wieso ein Scherz ?! Vllt. hat er sie auch einfach nicht gesetzt, weil er sie nicht brauchte. Außerdem ist die ID eigentlich nicht notwendig (wenn nicht sogar überflüssig), denn nimm einfach SendMessage, da übergibt man den Handle direkt.



  • die id ist notwendig fuer die eigenen messages

    switch
    command
    id

    fuer static texte allerdings vergeb ich nie richtige id's - wozu, kann eh keine messages daher empfangen {zb anklicken oder soetwas}



  • Mr Evil schrieb:

    fuer static texte allerdings vergeb ich nie richtige id's - wozu, kann eh keine messages daher empfangen {zb anklicken oder soetwas}

    Jo, genau das meinte ich 👍 . Obwohl, in seltenen Fällen brauchen auch die eine ID, bzw. ist es sinnvoll eine zu vergeben.


Anmelden zum Antworten