2009-02-04 11 views

Antwort

10

Ja, das ist die einzige Möglichkeit, die mir bekannt ist.

Aber Sie müssen damit umgehen, dass GFW NULL zurückgeben kann. In der Regel tritt dies auf, wenn ein anderer Desktop (z. B. der Bildschirmschoner-Desktop) aktiv ist. Beachten Sie, dass die Verwendung eines Sicherheitskennworts Auswirkungen darauf haben kann, ob ein anderer Desktop verwendet wird (dies ist abhängig von der Windows-Version und ich kann mich nicht erinnern, wie die verschiedenen Versionen funktionieren).

Auch dieser Code wird im Debug-Modus unter Visual Studio nicht ordnungsgemäß funktionieren, weil Sie VS Fensterhandle erhalten.

Anders als das alles peachy :-)

1

Ja, Sie korrekt sind, wenn nicht anders Sie Active von jedem Thread überprüfen möchten.

1

Ich nehme an, dass Sie das Fenster meinen, das den Eingabefokus hat, wenn Sie "aktives Fenster" sagen?

In diesem Fall vergessen Sie die GetForegroundWindow() API. Dadurch wird das oberste Fenster zurückgegeben - nicht immer das Fenster mit dem Eingabefokus.

Verwenden Sie stattdessen GetFocus().

+0

geändert hat, das ist falsch: „GetFocus das Fenster mit dem Tastaturfokus für die aktuelle zurück Thread-Nachrichtenwarteschlange. [...] Verwenden Sie die GetForegroundWindow-Funktion, um das Handle in dem Fenster abzurufen, mit dem der Benutzer gerade arbeitet. " –

+0

Wie gesagt: "wenn Sie das Fenster meinen, das den Eingabefokus hat". – Stefan

+0

Ja, ich meine das Fenster, in dem der Benutzer arbeitet. Danke –

1

Sie können versuchen, WM_ACTIVATEAPP Nachricht zu verwenden.
zunächst eine Bool Variable bool wActive = false, in der WndProc Prozedur definieren, hier ist das nächste Stück Code:

case WM_ACTIVATEAPP: 
    wActive = (bool)wParam; 
return 0; 

Sie zu MSDN gehen können mehr Informationen über WM_ACTIVATEAPP

0

Ja, GetForgroundWindow() zu finden, eine gute Möglichkeit, zu überprüfen, verhält sich sogar mit einem "Always on top" -Fenster aka HWND_TOPMOST.

Ein anderer Weg ist mit GetActiveWindow()

HWND temp = GetActiveWindow(); 
    if (temp == hWnd) // Then your current window has focus 

Alternativ können die folgenden Meldungen berichten, wenn der Fokus

case WM_KILLFOCUS: 
     // windowHasFocus = false 
    break; 

    case WM_SETFOCUS: 
     // windowHasFocus = true; 
    break; 
Verwandte Themen