Nach Start des Programms Fokus abgeben



  • Hallo!
    Mein Programm soll direkt nach dem Start seinen Fokus wieder abgeben an den vorigen Besitzer.
    Eigentlich nicht schwer, sollte man meinen, aber es passiert nix!

    case WM_SETFOCUS:   {
                SetFocus((HWND) wParam);
                return 0;
                }
    

    Was ist denn falsch?



  • The window must be attached to the calling thread's message queue.

    Das hier ist dzu vielleicht ganz interessant (Beitrag von rolleyes)



  • Hmm, ich habe alles ausprobiert, auch den Code von rolleyes.
    Geht aber immer noch nicht. 😕

    Ist der wParam auch wirklich der, der won WM_SETFOCUS geliefert wird?
    Oder eher der von WndProc(..) ?



  • Original erstellt von Mika:
    Hmm, ich habe alles ausprobiert, auch den Code von rolleyes.
    Geht aber immer noch nicht. 😕 ?

    Das liegt vielleicht auch daran, dass du kein gültigens Handle bekommst:

    Handle to the window that has lost the keyboard focus. This parameter can be NULL.

    Bei WM_ACTIVATE steht das auch, wird also auch nicht viel mehr bringen 😞

    Original erstellt von Mika:
    Ist der wParam auch wirklich der, der won WM_SETFOCUS geliefert wird?
    Oder eher der von WndProc(..)

    WM_SETFOCUS liefert doch keinen wParam, der ist immer von WndProc. Nur beinhalten wParam und lParam je nach uMsg was anderes 😉



  • Ok, daß WM_SETFOCUS keinen Parameter übergibt, ist mir jetzt auch klar.

    Aber das Handle muß doch ein gültiges sein: z.B. das von Visual Studio!

    Also nochmal, ich führe mein Programm von Visual Studio aus aus ( 🙂 , Strg+F5), das Programmfenster ist mit WS_EX_TOPMOST immer im Vordergrund.
    Es sollte den Fokus aber sofort wieder zurück an in diesem Fall Visual Studio geben. So kann ich mit meinem Hauptprogramm direkt weiterarbeiten (z.B. Tastatureingaben), das aufgerufene Programm ist aber trotzdem zu sehen.

    So sollte es sein! 🙄



  • Du könntest versuchen, vor dem Erzeugen deines Fensters mit GetForegroundWindow(); das derzeit aktive Fenster zu ermitteln und nach Erzeugen deines Fensters wieder in den Vordergrund zu bringen. (siehe Link von oben)

    Allerding steht auch hie wieder:

    The return value is a handle to the foreground window. The foreground window can be NULL in certain circumstances, such as when a window is losing activation.



  • Ich habe jetzt eine globale Variable angelegt und in InitInstance(..) initialisiert:

    lastActiveWindow=GetForegroundWindow();
    

    In WM_CREATE habe ich dann rolleye's Funktion aufgerufen:

    winSetForegroundWindow(lastActiveWindow);
    

    Es funktioniert nun, wenn auch sehr komisch: Beide Fenster haben jetzt einen aktiven Rahmen (dunkelblau als Standard)! 😕 😮

    Da bleibt noch ein fader Beigeschmack an der ganzen Sache - noch irgendwelche Ideen?



  • Ich habe eine viel einfachere Lösung gefunden, wen's interessiert:

    Einfach ShowWindow(hWnd, SW_SHOWNA); in InitInstance(..) schreiben... 😉


Anmelden zum Antworten