【问题标题】:How can I tell if a window has focus? (Win32 API)如何判断窗口是否有焦点? (Win32 API)
【发布时间】:2010-10-02 18:06:53
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 您是想问“这个窗口有焦点吗”,还是“这个应用程序的任何窗口有焦点”?
  • 我在下面的评论中指出,这个应用程序只有一个窗口。

标签: windows winapi hwnd


【解决方案1】:

对于多个无模式的孩子:

child 中,您可以保存焦点,2019 年 8 月 13 日 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;

【讨论】:

    【解决方案2】:

    除了 gkrogers 使用 GetActiveWindow 回答之外,您还可以通过捕获 WM_SETFOCUSWM_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 ;
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 应用程序永远只有一个窗口,没有子窗口或子窗口。
        猜你喜欢
        • 1970-01-01
        • 2010-09-27
        • 1970-01-01
        • 1970-01-01
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多