Hilfe bei Sendmessage

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Telcrome.

    Hilfe bei Sendmessage

    Hallo,
    ich bräuchte nur mal kurz Hilfe bei dem Code von Trerkor zum Simulieren eines Mausklicks mithilfe der Sendmessage API. Hier kommt der Code her
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Declare Ansi Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Keys, ByVal lParam As Integer) As Integer
    2. Private Const WM_LBUTTONUP As Long = &H202
    3. Private Const WM_LBUTTONDOWN As Long = &H201
    4. Dim ClickPos As Integer = MakeDWord(80, 230)
    5. SendMessage(WindowHandle.Item(WindowToSendTo), WM_LBUTTONDOWN, Keys.LButton, ClickPos)
    6. SendMessage(WindowHandle.Item(WindowToSendTo), WM_LBUTTONUP, Keys.LButton, ClickPos)
    7. Private Function MakeDWord(ByVal LoWord As Integer, ByVal HiWord As Integer) As Integer
    8. MakeDWord = (HiWord * &H10000) Or (LoWord And &HFFFF&)
    9. End Function


    Jetzt kopiere ich einfach die Deklaration, die API und die Funktion oben bei mir in den Code rein, also das hier:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Declare Ansi Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Keys, ByVal lParam As Integer) As Integer
    2. Private Const WM_LBUTTONUP As Long = &H202
    3. Private Const WM_LBUTTONDOWN As Long = &H201
    4. Private Function MakeDWord(ByVal LoWord As Integer, ByVal HiWord As Integer) As Integer
    5. MakeDWord = CInt((HiWord * &H10000) Or (LoWord And &HFFFF&))
    6. End Function


    und rufe den Code so auf, sodass in ein Webbrowser-Steuerelement an der Position 80, 230 geklickt werden soll:

    VB.NET-Quellcode

    1. Dim ClickPos As Integer = MakeDWord(80, 230)
    2. SendMessage(CInt(MainWeb.Handle), WM_LBUTTONDOWN, Keys.LButton, ClickPos)
    3. SendMessage(CInt(MainWeb.Handle), WM_LBUTTONUP, Keys.LButton, ClickPos)


    Das Problem bei der Sache ist jetzt, dass einfach nichts passiert...
    Hwnd as Integer?
    Wohl eher als IntPtr od. Long.

    Viel. ist die Signatur veraltet?
    pinvoke.net/default.aspx/user32.SendMessage

    Die Aktuelle:

    VB.NET-Quellcode

    1. Declare Auto Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr


    Od. eine der Überladungen:

    VB.NET-Quellcode

    1. Declare Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal Msg As Integer,
    2. ByVal wParam As IntPtr, ByRef lParam As StringBuilder) As IntPtr
    3. Declare Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal Msg As Integer,
    4. ByVal wParam As IntPtr, ByRef RECT As IntPtr) As IntPtr
    5. Declare Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal Msg As Integer,
    6. ByVal wParam As IntPtr, ByRef POINT As IntPtr) As IntPtr



    NEVER use "bool", "int", or "integer" as the return value. Your core WILL crash on 64-bit windows. ONLY use IntPtr. It's not safe to use bool - pInvoke cannot marshal an IntPtr to a boolean.
    /nicht getestet
    okay also das funktioniert wenn ich als handle "me.handle" angebe und einen klick auf die Form abfrage, aber wenn ich jetzt "MainWeb.handle" angebe kommt der Klick immer noch nicht in den Browser.

    Was muss ich der Sendmessage jetzt noch angeben.

    PS: Ich hab jetzt nur den API-Zugriff ersetzt gegenüber zu meinen ersten Codes

    VB.NET-Quellcode

    1. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    2. Private Shared Function FindWindowEx(ByVal parentHandle As IntPtr, _
    3. ByVal childAfter As IntPtr, _
    4. ByVal lclassName As String, _
    5. ByVal windowTitle As String) As IntPtr
    6. End Function
    7. '@Sub Foo()
    8. 'Setzt voraus, das nur ein WebBrowser auf der Form ist.
    9. 'Q: _
    10. 'http://stackoverflow.com/questions/5673099/c-sharp-get-child-handles-using-findwindowex-by-name-and-ordinal-number
    11. 'http://stackoverflow.com/questions/3443325/sendmessage-wm-lbuttondown-up-works-on-buttons-but-not-window
    12. Dim WebHandle = FindWindowEx(Me.Handle, IntPtr.Zero, "WebBrowser", string.Empty);
    13. Dim ClickPos As IntPtr = New IntPtr(MakeDWord(80, 230))
    14. SendMessage(WebHandle, WM_LBUTTONDOWN, Keys.LButton, ClickPos)
    15. SendMessage(WebHandle, WM_LBUTTONUP, Keys.LButton, ClickPos)
    /nicht getestet
    Probier mal diesen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. <System.Runtime.InteropServices.DllImport("User32.Dll")> _
    3. Public Shared Function mouse_event(ByVal dwFlags As Integer, ByVal dx As Integer, ByVal dy As Integer, ByVal cButtons As Integer, ByVal dwExtraInfo As Integer) As Integer
    4. End Function
    5. Const MOUSEEVENTF_ABSOLUTE As Integer = &H8000
    6. Const MOUSEEVENTF_LEFTDOWN As Integer = &H2
    7. Const MOUSEEVENTF_LEFTUP As Integer = &H4
    8. Const MOUSEEVENTF_MIDDLEDOWN As Integer = &H20
    9. Const MOUSEEVENTF_MIDDLEUP As Integer = &H40
    10. Const MOUSEEVENTF_MOVE As Integer = &H1
    11. Const MOUSEEVENTF_RIGHTDOWN As Integer = &H8
    12. Const MOUSEEVENTF_RIGHTUP As Integer = &H10
    13. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    14. Cursor.Position = New Point(100, 100) ' Position der Maus setzen (in absoluten Screen-Koordinaten)
    15. mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0) ' Down
    16. mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0) ' Up
    17. End Sub
    18. End Class
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany:
    Es geht um einen Mausklick, der auch im minimiertem Fenster durchführbar ist, mit dem Code von dir mach ich es bisher^^

    @rotherford:
    SendMessage erwartet einen Integerwert als erstes Parameter, weshalb der Versuch das Webhandle als Parameter anzugeben mit der Fehlermeldung "ungülitige Konvertierung des Typs IntPtr in Typ Integer" scheitert.

    Telcrome schrieb:

    SendMessage erwartet einen Integerwert als erstes Parameter,

    Neee:

    VB.NET-Quellcode

    1. Declare Auto Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
    /nicht getestet

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

    Next Try:

    VB.NET-Quellcode

    1. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    2. Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
    3. End Function
    /nicht getestet

    Telcrome schrieb:

    Es geht um einen Mausklick, der auch im minimiertem Fenster durchführbar ist,
    Solch unwichtige Information hätte ich bei der Problembeschreibung auch weggelassen. :S
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!