WinApi - 如何获取SHELLDLL_DefView

时间:2016-04-12 07:40:56

标签: c++ windows winapi spy++

我正在尝试获取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。工人是的。

有人可以帮忙吗?

2 个答案:

答案 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);
}