我有一个Win32应用程序,用于确定是否有任何可见的、非图标化的、可最小化的窗口正在显示。据我所知,它在Win9x到Win8.1上工作良好,但在Windows 10下,它经常会发现一些实际上并不在屏幕上可见的窗口。
为了尝试确定发生了什么事情,我编写了一个简单的测试应用程序,枚举并记录所有这样的窗口。这里是EnumWindows回调代码的精华:
BOOL CALLBACK EnumFunc( HWND hWnd, LPARAM lParam )
{
if ( IsWindowVisible( hWnd ) )
{
if ( !IsIconic( hWnd ) )
{
const LONG style = GetWindowLong( hWnd, GWL_STYLE );
if ( WS_MINIMIZEBOX & style )
{
// record window info
}
}
}
return TRUE;
}
大多数在 Windows 10 下出现的幻影窗口属于后台存储应用程序进程,例如 Mail、Calculator 和 Photos。这些进程会在任务管理器的“后台进程”部分列出,如果我使用任务管理器终止这些后台任务,则我的测试应用程序将不再找到它们的幻影窗口。
从我的测试应用程序的上述截图中,您可以看到除了一个窗口外,所有有问题的窗口都属于同一进程 ID 7768 的线程,该进程是 ApplicationFrameHost.exe。具有进程 ID 11808 的最后一个窗口是 explorer.exe。
我已经用 Spy++ 查看了这些幻影窗口,但没有发现任何特定的样式组合可以帮助唯一地识别它们。
有人建议未记录的 Windows“band”可能涉及其中,但我尝试使用(未记录的,因此可能是错误的)API:
BOOL WINAPI GetWindowBand (HWND hWnd, PDWORD pdwBand);
但是它对于任何窗口都返回1的频带,因此不能区分这些虚幻的窗口。如何可靠地识别这些虚幻的窗口?
BOOL
返回值还是由第二个参数指向的DWORD
? - IInspectable