2009-01-21 418 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。然後,您只需將其與應用程序的窗口進行比較,以檢查它是否包含焦點。

相關問題