34 Stimmen

Wie kann ich feststellen, ob ein Fenster den Fokus hat? (Win32 API)

Wie kann ich mit der Win32-API (in C, aber das ist unwichtig) feststellen, ob ein bestimmtes Fenster (identifiziert durch HWND) den Fokus hat?

Ich bin Hooking eine Anwendung beobachten für ein Ereignis, und wenn dieses Ereignis auftritt, möchte ich überprüfen, ob die Anwendung bereits den Fokus hat. Wenn dies nicht der Fall ist, möchte ich das Fenster blinken, bis sie den Fokus zu ihm geben.

Alternativ wird das FlashWindowEx struct-Flag FLASHW_TIMERNOFG, das blinkt, bis das Fenster den Fokus hat nur nicht blinken, wenn das Fenster bereits den Fokus hat?

Ich kann das jetzt nicht testen, da ich nicht in meiner Entwicklungsumgebung bin, aber ich hatte den Eindruck, dass es sowieso blinken würde, was ich vermeiden möchte.

Falls es von Bedeutung ist, verwendet die Anwendung in diesem Fenster auch DirectX.

0 Stimmen

Soll die Frage lauten: "Hat dieses Fenster den Fokus" oder "Hat eines der Fenster dieser Anwendung den Fokus"?

0 Stimmen

Ich habe in einem Kommentar unten angemerkt, dass diese Anwendung nur ein Fenster haben wird.

34voto

gkrogers Punkte 7817

GetActiveWindow gibt die Top-Level Fenster, das mit dem Eingabefokus verbunden ist. GetFocus gibt das Handle des Fensters zurück, das den Eingabefokus hat.

Dieser Artikel könnte helfen:
http://www.microsoft.com/msj/0397/Win32/Win320397.aspx

0 Stimmen

Dieses Dienstprogramm ist großartig!

2 Stimmen

Der Link ist nicht mehr an der angezeigten Stelle verfügbar, sondern wird als archiviert angeboten: web.archive.org/web/200308

2 Stimmen

Oder, für eine Seite, die etwas moderner ist als die von @Sabuncu, versuchen Sie diese: msdn.microsoft.com/de-us/library/Windows/desktop/

18voto

bobobobo Punkte 61051

Neben gkrogers Antwort mit GetActiveWindow können Sie auch eine boolesche Variable für das Fenster pflegen, von dem Sie wissen wollen, ob es den Fokus hat oder nicht, indem Sie die WM_SETFOCUS y WM_KILLFOCUS Ereignisse, oder WM_ACTIVATE :

WndProc() ..
case WM_SETFOCUS:
  puts( "Got the focus" ) ;
  break ;

case WM_KILLFOCUS:
  puts( "Lost the focus" ) ;
  break;

case WM_ACTIVATE:
  if( LOWORD(wparam) == WA_INACTIVE )
    puts( "I AM NOW INACTIVE." ) ;
  else // WA_ACTIVE or WA_CLICKACTIVE
    puts( "MEGAZORD ACTIVATED kew kew kew (flashy-eyes)" ) ;
  break ;

11voto

Jason Cohen Punkte 78227

Meinen Sie wirklich "Fokus" oder meinen Sie "aktiv"?

Ein Fenster hat den Fokus - dasjenige, das als erstes die Tastaturereignisse erhält. Das äußere Fenster (das der Benutzer über den Bildschirm ziehen kann) ist "aktiv", wenn eines seiner Unterfenster den Fokus hat, aber es kann selbst den Fokus haben oder auch nicht.

1 Stimmen

Die Anwendung wird immer nur ein Fenster haben, keine Unterfenster oder untergeordneten Fenster.

4voto

Verwenden Sie die Funktion GetForegroundWindow, um die Hwnd zu erhalten, die Sie gerade fokussieren. Dann müssen Sie es nur noch mit dem Fenster Ihrer Anwendung vergleichen, um zu prüfen, ob es den Fokus enthält oder nicht.

0voto

user11910606 Punkte 21

Für mehrere modelllose Kinder:

Innerhalb der Kind können Sie den Fokus speichern, 13/08/2019 Visual Studio 2017.

Sie können den Fokus speichern, damit der Elternteil weiß, auf welches modelllose Kind geklickt wurde.

Im Callback-Handler des Kindes:

case WM_CHILDACTIVATE: // Only gets called when the child border is click on.
    //CurrentFocus = hDlg; // Example: can save the focus globally for parent usage.
    //Beep(2000, 250); // So you can test
break;

case WM_GETMINMAXINFO: // Gets called when child window is being moved or sized.
        //Beep(2000, 250);
break;

case WM_LBUTTONDOWN:  // Only called when cursor is inside the child client area
    //CurrentFocus = hDlg; // Following the focus.
    //Beep(2000, 250);
break;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X