如何判断窗口是否具有焦点? (Win32 API)

时间:2009-01-21 18:02:04

标签: windows winapi hwnd

使用Win32 API(在C中,但这无关紧要)如何判断给定窗口(由HWND标识)是否具有焦点?我正在挂钩观看活动的应用程序,当该事件发生时,我想检查应用程序是否已经有焦点。如果没有,我想要闪烁窗口,直到它们聚焦于它。

或者,如果窗口已经有焦点,FlashWindowEx结构标志FLASHW_TIMERNOFG是否闪烁,直到窗口具有焦点而不闪烁?我现在无法测试这个,因为我不在我的开发环境中,但我的印象是它会闪现,这正是我想要避免的。

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

5 个答案:

答案 0 :(得分:25)

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

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

答案 1 :(得分:15)

除了gkrogers使用GetActiveWindow回答之外,您还可以通过捕获WM_SETFOCUSWM_KILLFOCUS事件或{{3}来维护您想要知道的窗口的布尔变量(如果它有焦点) }

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

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

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

答案 2 :(得分:7)

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

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

答案 3 :(得分:4)

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

答案 4 :(得分:0)

对于多个无模式的孩子: 在孩子里面,您可以保存焦点,19/08/19 VS2017。 您可以保存焦点,以便父母知道单击了哪个非模态孩子。

在childs回调处理程序中:

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;