win32-GetActiveWindow和GetForegroundWindow

最近被这两个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返回的是之前的活动窗口句柄。

原文地址:https://www.cnblogs.com/strive-sun/p/13370662.html