SendMessage bei versteckten Fenstern

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Cr4ckY.

    SendMessage bei versteckten Fenstern

    Hallo,
    kurze Frage: ist es normal, dass man mit SendMessage kein Button/CheckBox anklicken kann, wenn das Fenster versteckt ist?
    Bei mir ist es zurzeit so, dass wenn nur mein VB.NET Programm, bei dem ich SendMessage verwende, und das andere Programm, bei dem ich ein Button anklicken will offen sind, dann klappt es. Wenn ich jedoch das Programm auch nur minimiere (muss nicht mal versteckt sein), dann wird der Button nicht mehr gedrückt..erst wenn das Fenster wieder sichtbar ist.
    Wenn es nicht anders geht, welche Möglichkeiten gibt es sonst noch, Buttonklicks usw in versteckten Fenstern auszuführen?
    Ist das nicht das gleiche wie SendMessage? Achja, was ich vergessen hab zu sagen: wenn ich z.B. irgendeinen Text an den Notepad sende und dieser auch versteckt ist, klappt es mit SendMessage immer noch, jedoch kann ich aber keine Buttons anklicken...
    Ich versuch es gleich mal mit PostMessage.
    In deiner PM sagtest du, ich mach was falsch, aber wenn es so wäre, dann würde der Button ja auch nicht angeklickt werden, wenn das Fenster nicht versteckt ist, oder? Naja hier mal mein Code:

    VB.NET-Quellcode

    1. Const WM_LBUTTONDOWN As UInteger = &H201
    2. Const WM_LBUTTONUP As UInteger = &H202
    3. 'Sub Button_Click
    4. Dim hWndMain As Integer
    5. Dim hWndStartButton As IntPtr
    6. hWndMain = Process.GetProcessesByName("Prozessname")(0).MainWindowHandle
    7. hWndStartButton = FindWindowEx(hWndMain, 0, "WindowsForms10.BUTTON.app.0.378734a", "Start")
    8. PostMessage(hWndStartButton, WM_LBUTTONDOWN, 0, 0)
    9. PostMessage(hWndStartButton, WM_LBUTTONUP, 0, 0)
    10. 'End Sub
    Der Button, den ich anklicken will, hat den Text "Start", wenn ich es durch vbNullString ersetze kann er den doch gar nicht anklicken..also es funktioniert nur nicht, wenn es minimiert/versteckt ist, ansonsten klappt es schon so mit diesem Code.
    Edit: Mit vbNullString, passiert gar nichts, egal ob das Fenster sichtbar/minimiert/versteckt ist.

    EDIT// Habe probiert ein Button im Taschenrechner mit VB zudrücken, also funz alles einwandfrei, egal ob der Rechner Minimiert oder im hintengrund. Scheint du hast falsche handle, entweder von fenster oder von Button. Schau dass richtige Handle und richtige Klassen Namen hast
    Der Code ist richtig:

    VB.NET-Quellcode

    1. Dim hWndMain As IntPtr
    2. Dim hWndStartButton As IntPtr
    3. hWndMain = FindWindow ( vbNullString, "Titel/Name deine Anwendung")
    4. hWndStartButton = FindWindowEx(hWndMain, 0, "WindowsForms10.BUTTON.app.0.378734a", vbNullString)

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

    Sry, aber bei mir klappt das nicht, wenn ich den Buttontext (in meinem Fall "Start") durch vbNullString ersetze..kannst du mir mal deinen genauen Code zeigen, mit dem du einen Button im Windows-Rechner drückst? Also wo schon Titel vom Fenster usw vorhanden ist, will mal schauen ob es wirklich geht..

    VB.NET-Quellcode

    1. Dim hWndMain As IntPtr
    2. Dim hWndStartButton As IntPtr
    3. hWndMain = FindWindow ( vbNullString, "Rechner")
    4. hWndStartButton = FindWindowEx(hWndMain, 0, "Classen_Name ", vbNullString)



    in button click event:

    VB.NET-Quellcode

    1. PostMessage(hWndStartButton, WM_LBUTTONDOWN, 0, 0)
    2. PostMessage(hWndStartButton, WM_LBUTTONUP, 0, 0)




    War mir schon klar, das du irgend was falsch machst...

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

    sorry für doppeltpost !
    hier ist komplette code:

    VB.NET-Quellcode

    1. Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Int32
    2. Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As Int32, ByVal hWnd2 As Int32, ByVal lpsz1 As String, ByVal lpsz2 As String) As Int32
    3. Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Int32, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32) As Int32
    4. Private Const BM_CLICK As Int32 = &HF5
    5. Private iHwndForm As IntPtr
    6. Private iHwndButton As IntPtr
    7. Private Sub Button_Click (....)
    8. iHwndForm = FindWndow (vbNullString, "TestForm")
    9. iHwndButton = FindWindowEx ( iHwndForm, 0, "WindowsForms10.BUTTON.app.0.378734a", vbNullString)
    10. SendMessage(iHwndButton, BM_CLICK, 0, 0) 'Button drücken
    11. End Sub

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