Auf Button klicken

02/20/2013 01:21 justinjoel#1
Hey,

ich wollte mittels Visual Basic mit einem Button einen anderen Button in einem fremden Programm klicken bzw. drücken. Hab also gegoogled usw. und das hier gefunden:

Code:
Public Class Form1

    Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    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
    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

    Private Const BM_CLICK As Integer = &HF5

    Private iHwndForm As IntPtr 'Fensterhanlde ermitteln
    Private iHwndButton As IntPtr 'Buttonhandle ermitteln

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        'Fenster Handle ermitteln
        iHwndForm = FindWindow(vbNullString, "testForm")
        'Button Handle ermitteln
        iHwndButton = FindWindowEx(iHwndForm, 0, "ButtonID", vbNullString)
        'Click auf Button in zweite EXE senden
        SendMessage(iHwndButton, BM_CLICK, 0, 0) 'Button drücken

    End Sub
End Class
Nun verstehe ich nicht, was bei "FindWindow" rein soll.

FindWindowEx hab ich mit Spy ++ oder so die Button ID schon rausgefunden, hab sie hier jetzt nur rausgenommen.

Würde mich über eine schnelle Antwort freuen.

MfG
02/20/2013 12:12 Kraizy​#2
[Only registered and activated users can see links. Click Here To Register...]
Teil 1 & 3 könnte für dich hilfreich sein.
02/20/2013 13:10 justinjoel#3
Ok, das hat mir schon etwas geholfen ^^

Code:
Public Class Form1

    Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    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
    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

    Private Const BM_CLICK As Integer = &HF5

    Private iHwndForm As IntPtr
    Private iHwndButton As IntPtr

    Dim Hauptfenster As IntPtr = FindWindow("WindowsForms10.Window.8.app.0.2bf8098_r38_ad1", "Fenstername")
    Dim TabControl As IntPtr = FindWindowEx(Hauptfenster, IntPtr.Zero, "WindowsForms10.SysTabControl32.app.0.2bf8098_r38_ad1", Nothing)
    Dim TabPage1 As IntPtr = FindWindowEx(TabControl, IntPtr.Zero, "WindowsForms10.Window.8.app.0.2bf8098_r38_ad1", "TabName")
    Dim ButtonHandle As IntPtr = FindWindowEx(TabControl, IntPtr.Zero, "WindowsForms10.BUTTON.app.0.2bf8098_r38_ad1", "ButtonName")


    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click



    End Sub
End Class
Wenn das alles richtig wäre, was müsste dann ins Click Event vom Button? Konnte das aus dem Tutorial nicht so richtig entnehmen.

mfg
02/20/2013 13:12 Kraizy​#4
Der Aufruf der SendMessage-API? Ist doch logisch. Du kannst es von mir aus auch ins Load-Ereignis reinklatschen. Die FindWindow-Aufrufe kannst du ebenfalls darein packen.