SendMessage Enter geht nicht

  • VB.NET

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

    SendMessage Enter geht nicht

    Hi.

    Folgenden Code benutze ich, um mich in meinem (!) Spiel anzumelden:

    VB.NET-Quellcode

    1. Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    2. Private Const WM_CHAR As Integer = &H102
    3. Private Const ENTER As Integer = 13
    4. Private Const TAB As Integer = 9
    5. Private ID As String = "TEST"
    6. Private sroHwnd As IntPtr = Nothing
    7. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    8. sroHwnd = Process.GetProcessesByName("Engine")(0).MainWindowHandle
    9. For x As Integer = 0 To ID.Length - 1
    10. SendMessage(sroHwnd, WM_CHAR, AscW(ID(x)), 0)
    11. Next
    12. End Sub


    Das geht auch.

    Enter geht aber leider nicht...
    Den Code verwende ich:

    VB.NET-Quellcode

    1. SendMessage(sroHwnd, WM_CHAR, AscW(Chr(ENTER)), 0)


    Es passiert aber nichts im Spiel.

    Wo ist der Fehler?

    Danke :)
    Nimm mal die Signatur:

    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


    pinvoke.net/default.aspx/user32.SendMessage
    /nicht getestet
    @TheGameSiders: Machma statt WM_CHAR WM_SETTEXT
    und

    VB.NET-Quellcode

    1. <DllImport("user32.dll", CharSet := CharSet.Unicode)> _
    2. Public Shared Function SendMessage(hwnd As IntPtr, wMsg As Integer, wParam As IntPtr, lParam As String) As IntPtr
    3. End Function
    4. Const WM_SETTEXT As Integer = &HC
    5. SendMessage(hwndInput, WM_SETTEXT, IntPtr.Zero, text)
    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 schrieb:

    Public Shared Function SendMessage(hwnd As IntPtr, wMsg As Integer, wParam As IntPtr, lParam As String) As IntPtr
    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!
    Probiere solch Code zunächst mit dem Notepad.
    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!

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. sroHwnd = Process.GetProcessesByName("notepad")(0).MainWindowHandle
    3. For x As Integer = 0 To ID.Length - 1
    4. SendMessage(sroHwnd, WM_CHAR, AscW(ID(x)), 0)
    5. Next
    6. End Sub



    Da passiert dann garnichts.
    Ich muss das ja ohne Handles machen, weil ich ja wie im letzten Thema gesagt immer das selbe bei Spy++/WinID angezeigt bekomme...
    Mit folgendem Code kann man bestimmte Tasten direkt an ein Fenster senden vieleicht geht das? Wichtig ist das der MainwindowTitle korrekt geschrieben ist!

    VB.NET-Quellcode

    1. Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
    2. Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWndParent As Integer, ByVal hWndChildAfter As Integer, ByVal lpszClass As String, ByVal lpszWindow As String) As Integer
    3. Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
    4. Const WM_CHAR As Integer = &H102
    5. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    6. Dim hwnd = FindWindow(vbNullString, "Neu Textdokument.txt - Editor") 'Window title muss übereinstimmen
    7. Dim winex = CType(FindWindowEx(CInt(hwnd), 0, "Edit", vbNullString), IntPtr)
    8. SendMessage(CInt(winex), WM_CHAR, Keys.E, 0)
    9. SendMessage(CInt(winex), WM_CHAR, Keys.Enter, 0)
    10. End Sub


    mfG

    Derfuhr
    Du solltest nie das Notepad zum Testen Deines Codes verwenden, da dort das MainWindowHandle nicht das Handle des Edit-Windows ist.

    Verwende lieber CMD.exe (Befehlsprozessor), da stimmen beide überein.

    Wenn es in Deinem Spiel dennoch nicht funktioniert, so mag diese Art der Eingabe dort gesperrt sein (DirectX ?). Dann muss man ggf. auf DirectXInput ausweichen.

    Bei CMD.Exe sollte übrigens folgender Code funktionieren:

    VB.NET-Quellcode

    1. Dim hwnd = Process.GetProcessesByName("cmd")(0).MainWindowHandle
    2. SendMessage(hwnd, WM_CHAR, New IntPtr(Keys.A), IntPtr.Zero)
    3. Public Shared WM_CHAR As UInteger = 258
    4. <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    5. Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr
    6. End Function
    @Kangaroo: So isses, bei CMD ist es genau so. :D

    TheGameSiders schrieb:

    Geht leider nicht
    Bei mir schon.
    Wirf mal nicht die Deklarationen verschiedener Poster durcheinander.
    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!
    Hi.

    Das Problem ist, dass ich bei dem Code ein Handle brauche.

    Beim Editor: Edit

    Bei meinem Spiel ist das aber überall gleich.

    Ich habs mit Spy++ und WinID getestet, doch überall wo ich mit dem Maustool hinfahre, ist das handle gleich.
    Und das geht leider nicht...


    Hilfeee :(

    Und noch was.
    Mein Ziel war es mein Spiel in mein Programm einzubinden mit dem Tutorial geht das auch:
    [VB.NET] Prozess in die eigene Anwendung einbetten und wieder freigeben.

    Doch wie kann ich an das Fenster dann senden?
    Dann geht nichnichtmal mehr "TEST" zu senden.

    Habs mit dem Prozess Engine getestet und dem Prozess von der Hauptform.
    Was ist mit

    VB.NET-Quellcode

    1. <DllImport("user32")> _
    2. Public Shared Function EnumChildWindows(window As IntPtr, callback As EnumWindowProc, iptr As IntPtr) As <MarshalAs(UnmanagedType.Bool)> Boolean
    3. End Function
    Allerdings musste da erst mal den Gebrauch von finden und verstehen.
    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!