Button in minimierte Anwendung klicken

    • VB.NET

    Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

      Button in minimierte Anwendung klicken

      Hallo zusammen !
      In Forum wurde schon mehrmals gefragt, wie man einen Button in fremde minimierte Fenstern anklickt.
      Um das Ganze verständlicher zu erklären, habe ich in VB zwei Projekte erstellt. In jedem Projekt
      befindet sich eine Form und ein Button; die zwei Projekte (EXE) werden unabhängig voneinander
      ausgeführt.
      Im ersten Projekt im Button_Click Event wird mit der API Funtkion FindWindow Handle die
      EXE aus dem zweiten kompilierten Projekt ermittelt (Handle kann ohne API mit Process Klasse ermittelt werden).
      Mit Spy++ kann man den Klassennamen des Button in der zweiten EXE auslesen.
      Nach dem der Klassename des Button aus Zweite EXE bekannt ist, mit API Funktion FindWindowEx
      kann das Handle des Buttons ermittelt werden. Wenn das Button-Handle, der Button-Klassenamen und das Form-Handle
      von der zweiten EXE bekannt sind, dann kann mit Hilfe der API Funktion SendMessage und Win.Message BM_CLICK
      der Button in der zweiten EXE angeklickt werden.
      Nun zur Praxis:



      Code im ersten Projekt (EXE):

      1. Form
      2. Button auf Form plazieren
      3. Code einfügen:

      VB.NET-Quellcode

      1. Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
      2. Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As IntPtr, ByVal hWnd2 As IntPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As IntPtr
      3. Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As IntPtr, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
      4. Private Const BM_CLICK As Integer = &HF5
      5. Private iHwndForm As IntPtr 'Fensterhanlde ermitteln
      6. Private iHwndButton As IntPtr 'Buttonhandle ermitteln
      7. 'Button_Click Event
      8. Private Sub Button_Click (....)
      9. 'Fenster Handle ermitteln
      10. iHwndForm = FindWndow (vbNullString, "TestForm")
      11. 'Button Handle ermitteln
      12. iHwndButton = FindWindowEx ( iHwndForm, 0, "WindowsForms10.BUTTON.app.0.378734a", vbNullString)
      13. 'Click auf Button in zweite EXE senden
      14. SendMessage(iHwndButton, BM_CLICK, 0, 0) 'Button drücken
      15. End Sub



      Code im zweiten Projekt (EXE):


      1. Form
      2. Button auf Form plazieren
      3. Code einfügen:

      VB.NET-Quellcode

      1. Private Button_Click (...)
      2. MsgBox "Du hast mich angeklickt !"
      3. End Sub


      Ergebniss:
      Nun muss man beide EXE-Dateien starten. Wenn der Button in der EXE aus dem ersten kompilierten Projekt ankgeklickt wurde, wird
      eine Nachricht an den Button in EXE aus dem zweiten kompilierten Projekt gesendet und die MsgBox wird angezeigt.



      Bemerkung:
      Auf gleiche Vorgehensweise kann jedes Steuerelement, egal ob in der eigenen oder fremden Anwendung, angeklickt werden, siehe WIN MESSAGE.
      (Voraussetzung: Contros/Steuerelemente müssen in der EXE initialisiert werden. Wenn Controls/Steuerelemente aus DLLs initialisiert werden, dann
      muß man auf Schnittstellen zugreifen)

      Edit by ~blaze~:
      *Titel ausgebessert*

      Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „SystemUnknow“ ()

      Danke für deine schnelle Antwort.
      Doch leider funktioniert das ganze nur mit den beiden EXE Programmen, oder?

      ich habe es probiert, und zwar so: habe das Win-Prog. Paint gestartet und dort das [?] gedrückt -> Info.

      Im Fenster "Info über Paint" gibt es einen [OK] - Button den habe ich ausgelesen und in Form eingegeben, aber es läuft leider nicht.

      VB.NET-Quellcode

      1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
      2. 'Fenster Handle ermitteln
      3. iHwndForm = FindWindow(vbNullString, "OK")
      4. 'Button Handle ermitteln
      5. iHwndButton = FindWindowEx(iHwndForm, 0, "Button", vbNullString)
      6. 'Click auf Button in zweite EXE senden
      7. SendMessage(iHwndButton, BM_CLICK, 0, 0) 'Button drücken
      8. End Sub




      WARUM???
      Hallo,

      kurze Frage zum dem ClassName dieser wäre bei mir "ThunderRT6CommandButton" das Problem ist ich habe drei Buttons mit diesem Namen und wo ich mir den Namen vom Beispielprojekt genau angeschaut habe ist da noch eine Ergänzung und zwar folgende:

      WindowsForms10.BUTTON.app.0.378734a

      jetzt weiß ich nicht was dieses app.... genau ist.
      Zur Ergänzung ich verwende nicht Spy++ sondern XSpy

      Danke

      EDIT: Hat sich erledigt ich habs hinbekommen.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „xaverl“ ()

      Auch in VBA möglich ?

      Hallo Leute,

      ich habe mir gerade diesen Verlauf durchgelesen und habe es versucht nach zu machen, doch klappt es leider nicht.
      Wie die Überschrift es nun sagt, möchte ich wissen ob man das ganze auch in Vba ausführen kann.
      Meine Vba Kenntnisse sind nicht die besten deswegen hoffe ich mir kann einer von euch helfen.

      Ich entschuldige mich hier schon mal dafür, dass ich ein altes Thema hochkrame, aber es würde mich für mein aktuelles Projekt sehr interessieren.

      Mit freundlichem Gruß

      Willi
      Der Syntax bleibt der selbe?

      Edit:

      Hatte die Antwort von SystemUnknow überlesen. Ich werde mal, wenn ich auf der Arbeit Zeit habe oder zuHause bin es dazu schreiben.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Willi90“ ()

      Ich hab's mal mit Excel-VBA getestet:

      VB.NET-Quellcode

      1. Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
      2. Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
      3. Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
      4. Private Const BM_CLICK As Integer = &HF5
      5. Private iHwndForm As Long'Fensterhanlde ermitteln
      6. Private iHwndButton As Long'Buttonhandle ermitteln
      7. 'Button_Click Event
      8. Private Sub Button_Click ()
      9. 'Fenster Handle ermitteln
      10. iHwndForm = FindWindow (vbNullString, "TestForm")
      11. 'Button Handle ermitteln
      12. iHwndButton = FindWindowEx ( iHwndForm, 0, "WindowsForms10.BUTTON.app.0.378734a", vbNullString)
      13. 'Click auf Button in zweite EXE senden
      14. SendMessage(iHwndButton, BM_CLICK, 0, 0) 'Button drücken
      15. End Sub
      --
      If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
      --
      Wenn ich jetzt den Code von
      petaod nehme und in Access einfüge, sagt er mir direkt, das der Syntax von

      VB.NET-Quellcode

      1. SendMessage(iHwndButton, BM_CLICK, 0, 0) 'Button drücken


      Nicht angenommen wird. Ich habe den Code umgeschrieben und mit Sendkeys scheint es zu klappen.

      VB.NET-Quellcode

      1. SendKeys "(iHwndButton, BM_CLICK, 0, 0)"

      Willi90 schrieb:

      Wenn ich jetzt den Code von
      petaod nehme und in Access einfüge, sagt er mir direkt, das der Syntax von

      VB.NET-Quellcode

      1. SendMessage(iHwndButton, BM_CLICK, 0, 0) 'Button drücken


      Nicht angenommen wird. Ich habe den Code umgeschrieben und mit Sendkeys scheint es zu klappen.

      VB.NET-Quellcode

      1. SendKeys "(iHwndButton, BM_CLICK, 0, 0)"

      Ich hab keine Ahnung von VBA und weiß auch nicht, wofür SendKeys da ist, aber ich glaube nicht, dass der Code tut, was du möchtest, da du als Parameter nicht die versch. Variablen übergibst, sondern einen String, der "(iHwndButton, BM_CLICK, 0, 0)" lautet.
      @Willi90 : hier Code in Vb6/VBA:

      VB.NET-Quellcode

      1. Private Declare Function FindWindow Lib "user32.dll" _
      2. Alias "FindWindowA" ( _
      3. ByVal lpClassName As String, _
      4. ByVal lpWindowName As String) As Long
      5. Private Declare Function FindWindowEx Lib "user32.dll" _
      6. Alias "FindWindowExA" ( _
      7. ByVal hwndParent As Long, _
      8. ByVal hwndChildAfter As Long, _
      9. ByVal lpszClass As String, _
      10. ByVal lpszWindow As String) As Long
      11. Private Declare Function SendMessage Lib "user32" _
      12. Alias "SendMessageA" ( _
      13. ByVal hwnd As Long, _
      14. ByVal wMsg As Long, _
      15. ByVal wParam As Long, _
      16. lParam As Any) As Long
      17. Private Const BM_CLICK As Long = &HF5
      18. Private lngHwndForm As Long'Fensterhanlde ermitteln
      19. Private lngHwndButton As Long'Buttonhandle ermitteln
      20. 'Button_Click Event
      21. Private Sub Button_Click ()
      22. 'Fenster Handle ermitteln
      23. lngHwndForm = FindWindow (vbNullString, "TestForm")
      24. 'Button Handle ermitteln
      25. lngHwndButton = FindWindowEx ( lngHwndForm, 0, "WindowsForms10.BUTTON.app.0.378734a", vbNullString)
      26. 'Click auf Button in zweite EXE senden
      27. SendMessage(lngHwndButton, BM_CLICK, 0, 0) 'Button drücken
      28. End Sub