windows8 metro app窗口查找
EnumWindows枚举出来的窗口并不包含metro app,需要直接使用FindWindowsEx:
#include <windows.h> #include <locale.h> BOOL CALLBACK EnumWindowsProc( _In_ HWND hwnd, _In_ LPARAM lParam ) { TCHAR WindowsText[MAX_PATH]; GetWindowText(hwnd, WindowsText, MAX_PATH); _tprintf_s(WindowsText); _tprintf_s(TEXT("\n")); return TRUE; } VOID EnumWindowsWithMetro( __in WNDENUMPROC EnumFunc, __in LPARAM lParam ) { HWND ChildWindow = NULL; while (ChildWindow = FindWindowEx(NULL, ChildWindow, TEXT("Windows.UI.Core.CoreWindow"), NULL)) { if (!EnumFunc(ChildWindow, lParam)) return; } } int _tmain(int argc, _TCHAR* argv[]) { setlocale(LC_ALL, "zh-CN"); EnumWindowsWithMetro(EnumWindowsProc, 0); return 0; }
Windows.UI.Core.CoreWindow为metro app窗口类名。
运行效果图:
StarDock出品的软件ModernMix可以把metro app软件窗口化,估计是使用类似的原理。