代码之家  ›  专栏  ›  技术社区  ›  Daniel Jennings

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

  •  32
  • Daniel Jennings  · 技术社区  · 16 年前

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

    我正在挂接一个正在监视事件的应用程序,当该事件发生时,我想检查应用程序是否已经有焦点。如果没有,我想闪烁窗口,直到它们聚焦为止。

    或者,FlashWindowEx结构标志FLASHW_TIMERNOFG会一直闪烁到窗口有焦点,如果窗口已经有焦点,它不会闪烁吗?

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

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

    5 回复  |  直到 5 年前
        1
  •  33
  •   gkrogers    16 年前

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

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

        2
  •  18
  •   bobobobo    6 年前

    除了gkrogers使用GetActiveWindow进行回答外,您还可以通过捕获 WM_SETFOCUS WM_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
  •  10
  •   Jason Cohen    16 年前

    你真的是指“专注”还是“积极”

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

        4
  •  4
  •   user2133061 user2133061    12 年前

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

        5
  •  0
  •   Peter Mortensen Pieter Jan Bonestroo    5 年前

    对于多个非模态儿童:

    小孩 您可以在2019年8月13日的VisualStudio2017上保存焦点。

    您可以保存焦点,以便家长知道哪个非模态子项被点击了。

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

    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;