Sendkeys oder doch lieber keybdevent()?

  • VB.NET

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

    Sendkeys oder doch lieber keybdevent()?

    Hallo,
    ich habe eine Frage zu Sendkeys bzw. keybdevent()...

    Ich möchte Tastatureingaben an ein geöffnetes Programm senden.
    Nach der Methode keybdevent() habe ich es in einem früheren Projekt hinbekommen - jetzt, mit VirtualDub, klappt es nicht.

    Ich möchte das Programm öffnen, alt tab gedrückt halten (damit das Programm im Vordergrund ist) und loslassen.

    Danach soll alt f an das Programm gesendet werden.

    Leider kommt beim Programm nichts an...

    Sollte ich es lieber mit Sendkeys probieren?(da klappt es)
    Habe den Eindruck, dass Sendkeys eher verpönt ist...
    Gibt es Vorteile, wenn man keybd_event() verwendet?
    Aber da ich eher Anfänger bin, denke ich das ich es mit Sendkeys eher hinbekomme...
    Was soll ich tun?

    Vielen Dank...

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Imports System.Runtime.InteropServices
    4. Public Class Form1
    5. <DllImport("user32.dll")> Private Shared Sub keybd_event(bVk As Byte, bScan As Byte, dwFlags As UInteger, dwExtraInfo As UIntPtr)
    6. End Sub
    7. Private Shared Sub keybd_event(dwFlags As UInteger, dx As Integer, dy As Integer, dwData As UInteger, dwExtraInfo As Integer)
    8. End Sub
    9. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    10. Dim pfad_filme As String = "C:\_tägliche_AV-Aufnahme\#S8-auto-entw\_zu_entwackelnde_Filme\"
    11. Dim ordner As New IO.DirectoryInfo(pfad_filme), i As Integer = 0
    12. Dim präfix As String = "0", anzdateien As Integer = 0, anzdateienAVI As Integer = 0
    13. Const KEYEVENT_ALT As UInteger = &H12
    14. Const KEYEVENT_TAB As UInteger = &H9
    15. Const KEYEVENT_ENTER As UInteger = &HD
    16. Const KEYEVENT_SPACE As UInteger = &H20
    17. Const KEYEVENT_DOWN As UInteger = &H28
    18. Const KEYEVENT_UP As UInteger = &H26
    19. Const KEYEVENT_RIGHT As UInteger = &H27
    20. Const KEYEVENT_F As UInteger = &H46
    21. Const KEYEVENT_V As UInteger = &H56
    22. Const KEYEVENT_D As UInteger = &H44
    23. Const KEYEVENT_1 As UInteger = &H31
    24. Const KEYEVENT_4 As UInteger = &H34
    25. Const KEYEVENT_0 As UInteger = &H30
    26. Const KEYEVENT_8 As UInteger = &H38
    27. Const KEYEVENT_KEYUP = &H2
    28. Process.Start("C:\VirtualDub2\Virtual Dub II\VirtualDub2_44282\VirtualDub64.exe")
    29. 'mit alt tab aktivieren
    30. Threading.Thread.Sleep(1000)
    31. keybd_event(KEYEVENT_ALT, 0, 0, 0, 0)
    32. keybd_event(KEYEVENT_TAB, 0, 0, 0, 0)
    33. Threading.Thread.Sleep(1000)
    34. keybd_event(KEYEVENT_TAB, 0, KEYEVENT_KEYUP, 0, 0)
    35. keybd_event(KEYEVENT_ALT, 0, KEYEVENT_KEYUP, 0, 0)
    36. Threading.Thread.Sleep(1000)
    37. 'ALT + f (ALT alleine drücken geht nicht!!!)
    38. keybd_event(KEYEVENT_ALT, 0, 0, 0, 0)
    39. keybd_event(KEYEVENT_F, 0, 0, 0, 0)
    40. Threading.Thread.Sleep(1000)
    41. keybd_event(KEYEVENT_ALT, 0, KEYEVENT_KEYUP, 0, 0)
    42. keybd_event(KEYEVENT_F, 0, KEYEVENT_KEYUP, 0, 0)
    43. End Sub

    kwon schrieb:

    Danach soll alt f an das Programm gesendet werden.
    Vielleicht markierst Du das Zielfenster als aktives Fenster, damit wäre gesichert, dass die Eingaben dort landen.
    pinvoke.net/default.aspx/user32.setactivewindow
    Oder Du arbeitest mit SendMessage():
    pinvoke.net/search.aspx?search=SendMessage&namespace=user32
    Das Handle bekommst Du über die Process-Instanz, die Du natürlich auswerten musst:

    VB.NET-Quellcode

    1. Dim pr = Process.Start(...)

    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!
    Hallo RodFromGermany,

    vielen Dank für deine Mühe!!

    Habe mir die Hinweise angesehen.
    Leider habe ich momentan nicht die Zeit mich ausführlich mit dem Thema zu befassen.
    Da ich schnell eine Lösung brauche, werde ich bei Sendkeys bleiben...
    Tja, manchmal ist es eben auch eine Frage der Zeit...
    Ich danke für die Antwort!

    kwon schrieb:

    Sendkeys eher verpönt
    Bei Sendkeys kann passieren, dass was ganz anderes passiert, wenn der User zB die ShiftTaste gedrückt hält.

    Oder bei mehrschrittigen Abläufen irgendwo hinklickst, und damit ein anderes Fenster fokussiert - dann landen die Tastendrücke da.

    solche Sachen.

    keybdEvent ist glaub nicht ganz sicher davor, aber doch sicherer, weil die WindowHandle des Zielfensters mit angegeben wird, oder?
    (kenn mich nicht mit aus)
    Hi

    Wow, VirtualDub gibt es noch? Das steuern eines Programmes mittels SendKeys oder keybd_event ist doch noch nie gut gewesen. Meine Frage wäre eher, was machst Du mit VirtualDub? Evtl gibt es da ja andere alternativen in punkto Videobe-/verarbeitung.
    Mfg -Franky-
    Kurz nochmal zusammen fassend :D
    Also du möchtest ALT+F an VirtualDub64 senden.

    Vlt gibt es eine bessere möglichkeit?
    Kannst du kurz dein ganzes vorhaben beschreiben, oder willst du nur Dateien nach einander öffenen?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Jou. Je nach dem.
    Hatte ich auch gerade im Sinn.
    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!