OnScreenKeyboard reagiert nicht auf WinAPI SendInput

  • VB.NET
  • .NET (FX) 4.0

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

    OnScreenKeyboard reagiert nicht auf WinAPI SendInput

    Ich verwende die WinAPI-Funktion SendInput (MSDN) um Maus und Tastatur zu steuern. Dabei öffne ich die Bildschirmtastatur von Windows 10, indem ich einen Prozess mit dem Pfad C:\Program Files\Common Files\microsoft shared\ink\TabTip.exe starte.
    Das Problem ist folgendes:
    Wenn ich per SendInput auf einen Button der Bildschirmtastatur klicken will, reagiert die Bildschirmtastatur nicht. Das heißt: Der Button wird gehighlightet, wenn die Maus darüberbewegt wird, aber wenn die Maustaste mit SendInput gedrückt wird, wird der Button nicht geklickt.

    Ich verwende folgenden Code, um Mausklicks zu simulieren:

    VB.NET-Quellcode

    1. Dim Flags As MouseEventFlags
    2. Select Case Button
    3. Case MouseButton.Left
    4. Flags = If(IsButtonDown, MouseEventFlags.LEFTDOWN, MouseEventFlags.LEFTUP)
    5. Case MouseButton.Right
    6. Flags = If(IsButtonDown, MouseEventFlags.RIGHTDOWN, MouseEventFlags.RIGHTUP)
    7. Case MouseButton.Middle
    8. Flags = If(IsButtonDown, MouseEventFlags.MIDDLEDOWN, MouseEventFlags.MIDDLEUP)
    9. Case Else
    10. Throw New NopeException
    11. End Select
    12. NativeMethods.SendInput( _
    13. New Input With _
    14. {
    15. .Type = InputType.Mouse, _
    16. .Data = New Data With _
    17. {
    18. .MouseInput = New MouseInput With _
    19. {
    20. .dwFlags = Flags
    21. }
    22. }
    23. })

    Der Code hält sich mehr oder weniger an das Schema auf pinvoke.net:
    pinvoke.net/default.aspx/user32/SendInput.html
    pinvoke.net/default.aspx/Structures/INPUT.html

    Und es funktioniert in anderen Anwendungen. Also ich kann z.B. im Explorer Dateien markieren oder im Browser navigieren. Nur bei der Bildschirmtastatur funktioniert es nicht.

    Ich habe gerade nochwas herausgefunden:
    Wenn ich das Programm, das die Maus steuert, mit Administratorrechten starte (und damit auch die Bildschirmtastatur), dann funktioniert es.
    Wenn ich das Programm normal starte, die Bildschirmtastatur mit normalen Rechten öffne, das Programm dann schließe und mit Administratorrechten neu starte, dann funktioniert es auch.
    Ich vermute also, dass es was mit den Rechten von Prozessen zu tun hat.

    Wenn es keine andere Möglichkeit gibt, starte ich mein Programm immer im Administratormodus, aber ich möchte das gerne verhindern.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    @Mono
    Marshal.GetLastWin32Error gibt immer 0 zurück.

    @Artentus
    Ja. Ich steuere die Maus mit einem angeschlossenen Gamepad. Da ist es praktisch, wenn man für kurze Texte die Bildschirmtastatur öffnen kann.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Hab ich mal testweise deaktiviert. Hat keine Änderung gebracht. Und sogar wenn: Ich würde UAC gerne aktiviert lassen.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Ich hab das ganze mal ausprobiert. "sss" an das Notepad, Down und Up an Button, geht alles.
    Diese Tastatur ist einfach anders. :/
    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!
    Ich habe testweise mal andere Programme (wie z.B. Notepad) als Administrator gestartet und mein Programm nicht. Das Problem ist das gleiche wie bei der Bildschirmtastatur: Das Programm mit Administratorrechten reagiert nicht auf die Eingaben.
    Scheint wohl dieses User Interface Privilege Isolation Dings zu sein. Naja, dann halt mit Adminrechten.

    Ich hab jetzt auch mal probiert, wie auf Wikipedia beschrieben UIAccess auf True zu setzen, aber dann startet das Programm gar nicht mehr:

    Eine Referenzauswertung wurde vom Server zurückgesendet.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Das Testprogramm

    Niko Ortner schrieb:

    mit Adminrechten
    gestartet und es funktioniert. :D
    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!