我正在尝试获取SHELLDLL_DefView的句柄。
所以,我有这个代码。
HWND hProgman = FindWindow(L"Progman", NULL);
HWND hWnd = FindWindowEx(hProgman, 0, L"SHELLDLL_DefView", NULL);
Eveyrtihing工作正常,直到我将Windows桌面支架更改为幻灯片显示。然后当我用spy ++层次结构的窗口搜索时,SHELLDLL_DefView有另一个父窗口。现在是#32769(桌面) - > WorkerW - > SHELLDLL_DefView。所以我无法找到它。问题是当我尝试
时HWND desktop = GetDesktopWindow();
HWND hWnd = FindWindowEx(desktop , 0, L"WorkerW", NULL);
HWND hWnd = FindWindowEx(hWnd, 0, L"SHELLDLL_DefView", NULL);
找不到SHELLDLL_DefView。工人是的。
有人可以帮忙吗?
答案 0 :(得分:0)
我找到了答案。需要遍历所有WorkerW。
HWND destop = GetDesktopWindow();
HWND hWorkerW = NULL;
HWND hShellViewWin = NULL;
do
{
hWorkerW = FindWindowEx(destop, hWorkerW, L"WorkerW", NULL);
hShellViewWin = FindWindowEx(hWorkerW, 0, L"SHELLDLL_DefView", 0);
} while (hShellViewWin == NULL && hWorkerW != NULL);
答案 1 :(得分:0)
您的代码仅在某些Windows版本上有效,因为可以在“ WorkerW”或“ Progman”下找到“ SHELLDLL_DefView”,并且您发现“ WorkerW”类下可以有许多窗口(在Win7中正常)。
Microsoft Docs报告EnumWindows()比在循环中调用GetWindow()/ FindWindowEx()函数更可靠,因此(在Windows 98 / Windows 7上经过测试的)更通用的代码看起来像这样(例如您要刷新桌面) ):
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam) {
HWND hNextWin;
hNextWin = FindWindowExA(hwnd, 0, "SHELLDLL_DefView", 0);
if ( hNextWin ) {
// The correct desktop shell window under Progman/WorkerW will have only 1 child window!
if ( GetNextWindow(hNextWin, GW_HWNDNEXT) || GetNextWindow(hNextWin, GW_HWNDPREV) )
return true;
// We found correct handle
PostMessageA(hNextWin, WM_KEYDOWN, VK_F5, 0);
return false;
}
return true;
}
void main() {
EnumWindows(&EnumWindowsProc, 0);
}