最近被這兩個api搞得有點暈,故查閱了相關的資料。
這篇文章解釋的很好:https://devblogs.microsoft.com/oldnewthing/20081006-00/?p=20643
測試代碼:
case WM_LBUTTONDOWN: { HWND h1 = GetFocus(); HWND h2 = GetActiveWindow(); HWND h3 = GetForegroundWindow(); HWND h4 = SetActiveWindow(child_hwnd); HWND h5 = GetFocus(); HWND h6 = GetActiveWindow(); }
當點擊一個普通的win32窗口時,h1,h2,h3都返回相同的句柄。 如果在HWND h2 = GetActiveWindow();處打上斷點,運行代碼后,vs窗口會自動變成前景窗口,那么h1,h2仍然相同,即返回生成的win32窗口句柄,h3將變為vs的窗口句柄。
小結: GetActiveWindow是獲取當前調用線程里的active window,GetForegroundWindow是獲取全局的前景窗口。如果活動窗口不是本線程的,GetActiveWindow會返回NULL的。
一般情況下,我們用GetForegroundWindow會更多一些。
對於h4,h5,h6,就是使用SetActiveWindow函數,將焦點轉為線程內的另一個窗口,我這里是將焦點轉到子窗口上,然后h5,h6返回子窗口的窗口句柄,h4返回的是之前的活動窗口句柄。