Tastatur "emulieren"



  • HWND hwnd  = ::GetForegroundWindow();
    

    Du willst doch dein Fenster und nicht irgendeins (dass der Benutzer gerade aktive hat).
    Ich kenne mich nicht aus aber vielleicht ist FindWindow / EnumWindows eine Lösung um *dein* Fenster zu finden.

    Den Fokus für ein Fenster setzt du - wie im Artikel beschrieben - mit SetFocus (nachdem du AttachThreadInput gemacht hast). Lies den Artikel nochmal 🙂



  • Nee ich will ein Anderes Fenster (z.B. Editor, Explorer, etc.) und dort dann z.B. Navigieren.

    HWND hwnd  = ::GetForegroundWindow();
    

    Hohlt mir doch das Aktuelle Fensterhandle vo Aktiven Fenster.

    ::SetForegroundWindow(hwnd);
    

    Und hiermit setz ich doch dann das Aktuelle fenster in den Vordergrund, oder nicht?



  • Uruk-h4j schrieb:

    Nee ich will ein Anderes Fenster (z.B. Editor, Explorer, etc.) und dort dann z.B. Navigieren.

    HWND hwnd  = ::GetForegroundWindow();
    

    Hohlt mir doch das Aktuelle Fensterhandle vo Aktiven Fenster.

    ::SetForegroundWindow(hwnd);
    

    Und hiermit setz ich doch dann das Aktuelle fenster in den Vordergrund, oder nicht?

    Ohne die Funktionen benutzt zu haben und genau zu kennen:

    HWND hwnd  = ::GetForegroundWindow();
    ::SetForegroundWindow(hwnd);
    

    ist doch quatsch? hwnd ist doch schon das Vordergrund Fenster.

    Welches ist das aktive Fenster? Irgendeins...
    Deshalb kann ich mir kaum vorstellen, dass ::GetForegroundWindow() wirklich funktioniert (ok, ausser dein Fenster ist *zufällig* gerade aktiv).

    Ich glaube es wurde hier schon erwähnt (und ich hoffe ich erzähle nichts falsches): ein minimiertes Fenster ist nicht im Vordergrund (und kann es auch nicht sein).



  • Hmm...stimmt, ist irgendwie Sinnbefreit.

    Ich hab jetzt mal die Funktion drin:

    HWND hwnd = ::GetActiveWindow();
    

    Aber ist wieder das selbe. Mit aktiviertem Dialog von meine Prog läufts, als Tray nicht. Mir ist einfach nur unklar, warum es mit Dialog geht und ohne nicht. Martin hat was erwähnt von Threads und so, aber mein Prog läuft doch im Hintergrund weiter (läuft mittels Timer eine Funktion ab).



  • Klingt jetzt vielleicht böser als es gemeint ist:
    Liest du die Beiträge auch die gepostet werden?
    Hast du den Artikel den Martin gepostet hat gelesen (Seite 1)?

    Du kriegst hier schon Hilfestellung nur du musst dich auch etwas bemühen...

    SendInput: damit sendest du Tastatureingaben, als wenn wirklich eine Taste an der Tastatur gedrückt wird.
    Windows verteilt die Eingaben an das gerade aktive Fenster (sowohl bei SendInput als auch bei einem "echten" Tastendruck).

    Ist dein Programm minimiert (bzw. als Icon dargestellt -> "im Tray") ist es nicht aktiv.

    GetActiveWindow / GetForegroundWindow oder was es sonst noch gibt funktioniert dann nicht. Es wird das gerade aktive Fenster bestimmt - dein Fenster ist aber minimiert.

    Versuche dein Fenster mit FindWindow / EnumWindows zu finden
    (vielleicht gibt auch es eine bessere Möglichkeit).

    Desweiteren brauchst du für SendInput:

    1. AttachThreadInput (TRUE -> attach)
    2. SetFocus
    3. SendInput
    4. AttachThreadInput (FALSE -> detach)


  • Alternativ:
    Falls ich das richtig verstanden habe, hast du folgendes:
    Programm 1 liest Daten von deinem USB Gerät. Hat es Daten empfangen sendet es Programm 2 eine Nachricht.

    Es gibt bestimmt auch noch andere Wege Informationen zwischen 2 Programmen auszutauschen.
    Stichwort IPC: http://msdn2.microsoft.com/en-us/library/aa365574.aspx

    - Sockets
    - Shared Memory
    - vielleicht auch Benutzer definierte Nachrichen verschicken (gibts sowas? bestimmt ;-))



  • So nochmal was ich machen will, um zu vermeiden, dass man aneinander vorbeiredet:

    Ich habe ein USB-Device, was sich als HID (Human Interface Device) am System meldet (um genau zu sein einen Drehgeber und ein paar Tasten). Ich will mich jetzt in die Queue der Tastatur einklinken und Tastencodes senden.
    Z.B. Drehung des Drehgebers nach links = VK_LINKS wird an das Aktive Fenster (z.B. Explorer, Edito, etc) gesendet.
    Das soll mein Programm übernhemen, was es auch MIT Dialog problemlos tut.
    Erst seitdem ich das ganze in eine Tray-App gewandelt habe und der Dialog unsichtbar ist (ShowWindos(SW-HIDE)) kommt nix mehr durch (weil das Fenster ja nicht mehr vorhanden iet so wie ich das verstanden habe (grob umrissen)).

    Senden tu ich alles mittels SendInput, weil SendMessage / PostMessage unsinnig sind und DirektInput unsinnig für diese Anwendung ist (und weil ich dafür einen Treiber brauche).



  • Ich glaube dann haben wir aneinander vorbeigeredet 😉

    Ich habe angenommen, dass Programm welches die mit SendInput gesendeten Daten empfangen soll sei von dir; du stellst es als Tray-Icon dar und es empfängt nichts mehr.

    Da du anscheindend an das aktuelle Fenster (egal was für ein Programm es auch sein mag) senden willst war / ist GetForegroundWindow oder GetActiveWindow wohl richtig.

    Warum das ganze nicht mehr funktioniert, wenn du den "Sender" minimierst bzw. versteckst, hmm da bin ich überfragt.



  • so problem hat sich mehr oder weniger gefunden. 😡 In meinm Timer scheint was mit den Variablen nicht zu stimmen. Er aktualisiert diese nicht wirklich (sind Referenz-Variablen zum Abgelich von Postitionen und leider global). Wenn ich jetzt die Roh-Daten aus dem USB nehme läufts auch aus dem Tray-App hinaus.

    Danke für die Hilfeversuche !



  • Was ist das eigentlich für eine Tastatur?


Anmelden zum Antworten