31

使用 Win32 API(在 C 中,但这无关紧要),我如何判断给定窗口(由 HWND 标识)是否具有焦点?

我正在挂钩一个应用程序来监视一个事件,当该事件发生时,我想检查应用程序是否已经有了焦点。如果没有,我想闪烁窗口,直到他们关注它。

或者,如果窗口已经获得焦点,FlashWindowEx 结构标志 FLASHW_TIMERNOFG 是否会闪烁,直到窗口获得焦点才不会闪烁?

我现在无法测试这个,因为我不在我的开发环境中,但我的印象是它无论如何都会闪烁,这是我试图避免的。

此外,如果重要,应用程序会在此窗口中使用 DirectX。

4

5 回答 5

32

GetActiveWindow将返回与输入焦点关联的顶级窗口。GetFocus将返回具有输入焦点的窗口的句柄。

这篇文章可能会有所帮助: http:
//www.microsoft.com/msj/0397/Win32/Win320397.aspx

于 2009-01-21T18:08:23.493 回答
18

WM_SETFOCUS除了 gkrogers 使用 GetActiveWindow 回答之外,您还可以通过捕获andWM_KILLFOCUS事件来为您想知道它是否具有焦点的窗口维护一个布尔变量,或者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 ;
于 2011-09-04T19:11:03.017 回答
9

您的意思是“专注”还是“活跃”?

一个窗口具有焦点——第一个获取键盘事件的窗口。如果其子窗口之一具有焦点,则外部窗口(用户可以在屏幕上拖动)是“活动的”,但它本身可能有也可能没有焦点。

于 2009-01-21T18:05:41.300 回答
4

使用 GetForegroundWindow 函数获取您现在关注的 Hwnd。然后你只需要将它与应用程序的窗口进行比较,以检查它是否包含焦点。

于 2013-10-08T17:53:18.863 回答
0

对于多个无模式的孩子:

孩子中,您可以保存焦点,13/08/2019 Visual Studio 2017。

您可以保存焦点,以便父级知道单击了哪个无模式子级。

在孩子的回调处理程序中:

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;
于 2019-08-13T06:11:10.413 回答