[gelöst] Keystrokes an andere Anwendung schicken für On Screen Keyboard



  • Hi,

    also wie der thread titel schon sagt, bastel ich grade an einem OnScreenKeyboard. Da ergibt sich natürlich die Problematik, dass ich irgendwie die tastendrücke erzeugen und in ein anderes Programm bekommen muss.

    Bisher sieht meine Methode dafür so aus:

    void sendChar(wchar_t ch, HWND myWindow, HWND prevWindow)
    {
        AttachThreadInput(GetWindowThreadProcessId(myWindow,NULL), GetWindowThreadProcessId(prevWindow,NULL), TRUE);
            short key = VkKeyScan(ch);
            if(HIBYTE(key) & 0x01)
            {
                keybd_event(VK_SHIFT,0,0,0);
            }
            if(HIBYTE(key) & 0x02)
            {
                keybd_event(VK_CONTROL,0,0,0);
            }
            if(HIBYTE(key) & 0x04)
            {
                keybd_event(VK_MENU,0,0,0);
            }
            SetFocus(prevWindow);
            keybd_event(LOBYTE(key), 0, 0, 0);
            keybd_event(LOBYTE(key), 0, KEYEVENTF_KEYUP, 0);
            if(HIBYTE(key) & 0x01)
            {
                keybd_event(VK_SHIFT,0,KEYEVENTF_KEYUP,0);
            }
            if(HIBYTE(key) & 0x02)
            {
                keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0);
            }
            if(HIBYTE(key) & 0x04)
            {
                keybd_event(VK_MENU,0,KEYEVENTF_KEYUP,0);
            }
        }
    }
    

    Das funktioniert, allerdings nur für Tasten ohne modifier-keys.
    Wenn ich z.B. '/' senden möchte bekomme ich statdessen eine 7 (zumindest bei deutschem Tastaturlayout).
    Das Problem ist, dass ich nicht weis wie ich das mit den modifier keys hinbekommen soll.
    Muss ich wirklich die Bits einzelnd prüfen und entsprechende keystrokes schicken? Das scheint mir irgendwie etwas... unflexibel.
    Da gibts doch bestimmt ne einfachere Möglichkeit oder?

    /edit
    Noch eine Kleinigkeit zusätzlich:
    Es währe schön, wenn mein Fenster beim Senden im Vordergrund und aktiviert bleiben würde, ich würde also eine PostMessage variante vorziehen, wenn das nicht geht, naja, dann is das eben so...

    Wenn ich einfach am ende SetForegroundWindow(hwnd); aufrufe kommt der Focus zwar zurück aber das andere Fenster blinkt unschön auf und der keystroke wird nicht 100% zuverlässig verarbeitet(auf langsamen rechnern tut sich vermutlich garnix). Mit einem sleep lässt sich die situation zwar verbessern aber so wirklich das Wahre ist das auch nicht. Wie lange müsste ich auf einem 286 mit 1mb ram dann schon sleepen...

    /edit
    Naja, obwohl hier nicht besonders viel Hilfe kam hab ichs jetzt einigermassen hinbekommen und falls jemand anderes ein ähnliches Problem hat, kann er/sie das gern so benutzen.
    Das Fenster in dem man schreibt flackert allerdings unschön, da es ja immer kurz deaktiviert wird, wenn man aufs osk klickt. Wenn dafür noch jemand nen Fix kennt, her damit.

    Und ein zweites Problem ist aufgetaucht, dafür mache ich aber nen neuen thread auf, weils hier nicht so 100%ig reinpasst.



  • Ich hoffe es nimmt mir keiner übel wenn ich dashier nochmal hoch hole, weil ja einiges neues dazu kam...



  • hi

    kannst du noch bitte irgend ein beispielcode geben, wie man das Ding benutzt? Z.b. wenn ich eine exe starte, und dem programm (z.b. spiel für screenshots, produzieren etc.) wie man das dann ungefähr macht? Danke 🙂


Log in to reply