Fehlercode 87 in SendInput

  • VB.NET

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von SystemUnknow.

    Fehlercode 87 in SendInput

    Hi Leute,
    ich bin grad dabei ein Aufzeichnungsprogramm für Maus und Tastatur zu machen. Diese Aufzeichnungen sollen natürlich wieder abgespielt werden, dafür benutze ich SendInput.
    Der Code dafür sieht so aus, hab ich bei pinvoke gefunden.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub DoKeyBoard(ByVal flags As KEYEVENTF, ByVal key As Keys)
    2. Dim input As New INPUT
    3. Dim ki As New KEYBDINPUT
    4. input.dwType = InputType.Keyboard
    5. input.ki = ki
    6. input.ki.wVk = Convert.ToInt16(key)
    7. input.ki.wScan = 0
    8. input.ki.time = 0
    9. input.ki.dwFlags = flags
    10. input.ki.dwExtraInfo = IntPtr.Zero
    11. Dim cbSize As Integer = Marshal.SizeOf(GetType(INPUT))
    12. Dim result As Integer = SendInput(1, input, cbSize)
    13. If result = 0 Then Debug.WriteLine(Marshal.GetLastWin32Error)
    14. End Sub
    15. <StructLayout(LayoutKind.Explicit, pack:=1, Size:=28)> _
    16. Friend Structure INPUT
    17. <FieldOffset(0)> Public dwType As InputType
    18. <FieldOffset(4)> Public mi As MOUSEINPUT
    19. <FieldOffset(4)> Public ki As KEYBDINPUT
    20. <FieldOffset(4)> Public hi As HARDWAREINPUT
    21. End Structure
    22. <StructLayout(LayoutKind.Sequential, pack:=1)> _
    23. Friend Structure KEYBDINPUT
    24. Public wVk As Int16
    25. Public wScan As Int16
    26. Public dwFlags As KEYEVENTF
    27. Public time As Int32
    28. Public dwExtraInfo As IntPtr
    29. End Structure
    30. <DllImport("user32.dll", SetLastError:=True)> _
    31. Friend Shared Function SendInput(ByVal cInputs As UInt32, ByRef pInputs As INPUT, ByVal cbSize As Int32) As Int32
    32. End Function


    Das Problem:
    GetLastError gibt den Fehlercode 87 zurück: ERROR_INVALID_PARAMETER
    Ich habe leider keine Ahnung welcher Parameter es ist. Es wird wahrscheinlich an der INPUT-Structure liegen, wo soll man sonst Fehler machen?
    Das Sternchen zum Code auf pinvoke.net habe ich gelesen, das ist bestimmt der Fehler. Mit den Typen hab ich auch schon ein bisschen rumgespielt, so von unsigned zu signed usw.
    Leider kommt aber permanent Fehler Code 87... :(
    Kann mir einer von euch helfen? Danke :)
    mfG nibel
    Nur mal 2 Sekunden Deinen Code angesehen:
    Copy und Paste-Fehler:

    VB.NET-Quellcode

    1. Friend Structure INPUT
    2. <FieldOffset(0)> Public dwType As InputType
    3. <FieldOffset(4)> Public mi As MOUSEINPUT
    4. <FieldOffset(4)> Public ki As KEYBDINPUT
    5. <FieldOffset(4)> Public hi As HARDWAREINPUT
    6. End Structure
    --> FieldOffset(4) kommt 3x vor
    entweder die Offsets korrigieren, je nach Größe der Strukturen,
    oder ganz weglassen, da Du pack:=1 ansetzt.

    VB.NET-Quellcode

    1. Friend Structure INPUT
    2. Public dwType As InputType
    3. Public mi As MOUSEINPUT
    4. Public ki As KEYBDINPUT
    5. Public hi As HARDWAREINPUT
    6. End Structure
    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!
    Ohne FieldOffset und LayoutKind auf Sequential gestellt, kommt immer noch der Fehler.
    Ehrlich gesagt kam mir das logisch vor, da eine INPUT-Structure entweder eine MOUSEINPUT oder eine KEYBDINPUT oder eine HARDWAREINPUT-Structure aufnimmt, aber nie 2. Leider weiß ich jetzt nicht genau was da genau auf der unteren Ebene vor sich geht, wenn man eine INPUT Structure so initialisiert...