Problem mit GetNextWindow



  • Ich hatte vor kurzem schon einen Thread gemacht wie man keystrokes an andere Anwendungen schickt. Das funktioniert mittlerweile auch.

    Allerdings bleibt das Problem, das ich ein HWND des Fensters in das ich schreiben möchte brauche.

    Bisher hatte ich das immer mit

    prevWindow = GetNextWindow(myWindow, GW_HWNDNEXT);
    

    gemacht. Das funktioniert grundsätzlich auch. Komischer weise nicht immer.
    Mein Programm ruft die Funktion bei jedem tastendruck auf. Meistens geht das so 1-20 mal gut und plötzlich wird ein anderes Fenster aktiviert und beschrieben.
    Wenn das einmal passiert ist, geht garnichts mehr. Es werden scheinbar zufällig sichtbare und unsichtbare Fenster aktiviert.

    Ausserdem funktionieren GetNextWindow, GetWindow und co. nicht so wie ich es gern hätte, wenn mein fenster topmost ist. Dann werden normale fenster garnicht ausgewählt, was für ein on screen keyboard natürlich extrem ungünstig ist.
    GetTopWindow würde evtl. funktionieren, allerdings sollte das onScreenKeyboard zumindest zum Zeitpunkt des Tastendrucks immer selbst on top sein und somit fällt das auch weg...

    Wenn jemand Ideen hätte währe das sehr hilfreich. Achja, so sieht der code bei mir im Moment aus:

    void sendChar(wchar_t ch, HWND myWindow)
    {
        prevWindow = GetNextWindow(myWindow, GW_HWNDNEXT);
        //prevWindow = GetTopWindow(NULL);
        if(prevWindow != NULL)
        {
            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);
            }
        }
    }
    

    Ich hoffe das diesmal jemand helfen kann...



  • Sorry, das Problem mit den wilkürlichen Fenstern hat sich gelöst. Das lag daran, dass mein hwnd manchmal garnicht on top war wenn die Funktion aufgerufen wurde.

    Es bleibt allerdings das Problem, dass ich mein Fenster gern topmost machen würde, dann allerdings garnichts mehr geschrieben wird, da ich kein hwnd vom nächsten Fenster bekomm...



  • Lol seid ihr dumm! Unter linux gäbe es dieses problem nicht!



  • Super Antwort, da hat wohl jemand entdeckt das es am Horizont hinter Windows auch noch andere OS's gibt.
    Das macht Windows aber lange nicht überflüssig. Naja das ist eine andere Geschichte...

    Das Problem liess sich auf jeden Fall für mein OSK noch besser als ich erwartet hatte lösen. Der Trick war WS_EX_NOACTIVATE | WS_EX_TOPMOST. Damit bleibt das Fenster immer im Vordergrund, wird jedoch niemals aktiv. Der Fokus bleibt somit immer im "Zielfenster". Das hat vorallem auch bei Programmen wie Firefox vorteile, die beim aktivieren den Cursor in ein Textfeld (die Adresszeile) setzen und den gesamten Text markieren...
    Ein anderes Fenster muss jetzt auch nicht mehr ausgewählt/gefunden werden, einfach keybd_event's schicken und der Rest geht von allein.


Log in to reply