PrintWindow有什么问题?

时间:2011-06-05 06:41:24

标签: winapi screenshot

以下代码有什么问题?为什么PrintWindow会返回0?

HWND hwnd = GetDesktopWindow();
CHK(hwnd);

HDC hdc = GetWindowDC(hwnd);
CHK(hdc);

if (hdc)
{
    HDC hdcMem = CreateCompatibleDC(hdc);
    CHK(hdcMem);

    if (hdcMem)
    {
        RECT rc;
        CHK(GetWindowRect(hwnd, &rc));

        HBITMAP hbitmap = CreateCompatibleBitmap(hdc, rc.right-rc.left, rc.bottom-rc.top);
        CHK(hbitmap);   

        if (hbitmap)
        {
            SelectObject(hdcMem, hbitmap);

            CHK(PrintWindow(hwnd, hdcMem, 0)); //HERE return 0

            DeleteObject(hbitmap);
        }

        DeleteObject(hdcMem);
    }

    ReleaseDC(hwnd, hdc);
}

3 个答案:

答案 0 :(得分:2)

PrintWindow是一个相当薄的操作。它真正做的是将WM_PRINT消息发布到相关窗口的队列中,在本例中是桌面,并希望该窗口能够正确响应WM_PRINT(参见{{3 }和here)。

我重复了你的行为,但我并不是百分之百确定为什么它也失败了。也许您无法在PrintWindow上调用您的流程不拥有的HWND,或者桌面可能不会回复WM_PRINT条消息。

上面的第二个链接包含有关使用here的评论:

  

尝试获取句柄(HWND)   桌面窗口 - 并使用BitBlt来   捕获所有内容。提个醒 -   你只会捕捉可见的东西   屏幕。

也许这有帮助。

答案 1 :(得分:0)

替换:

HWND hwnd = GetDesktopWindow();

使用:

HWND hwnd = GetDesktopWindow();
hwnd = FindWindowEx( hwnd, 0, _T("Progman"), _T("Program Manager") );

我不确定这是否能得到你想要的东西。如果你想截取整个当前桌面的截图(包括可见的顶级窗口),那么BitBlt就是你想要的路线。

如果你想获得任务栏,你仍然可以使用这种方法,但你必须采取2个截图并将结果拼接在一起。

答案 2 :(得分:0)

看起来 GetDesktopWindow() 返回一个 virtual HWND,其值在所有 Windows 机器上普遍为 0x0010010。此虚拟 HWND 不符合通常的 PrintWindow 行为,因此 PrintWindow() 返回 FALSE,并且 GetLastError() 不报告此 PrintWindow 调用的错误代码。

要使 PrintWindow() 工作,您可以改用 GetShellWindow() 中的 HWND,其标题来自下图 WinSpy++ 的“程序管理器”。

enter image description here