2009-01-21 422 views
17

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

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

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

+0

你想问,“这个窗口是否有焦点”,或者“这个应用程序的窗口是否有焦点”? – ChrisW 2009-01-21 18:14:24

+0

我在下面的评论中指出,这个应用程序将只有一个窗口。 – 2009-01-21 18:19:53

回答

7

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

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

+1

该应用程序将只有一个窗口,没有子窗口或子窗口。 – 2009-01-21 18:09:00

13

除了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_ACTIVE) 
    puts("MEGAZORD ACTIVATED kew kew kew (flashy-eyes)") ; 
    else 
    puts("I AM NOW INACTIVE.") ; 
    break ; 
4

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

相关问题