【问题标题】:What is wrong with PrintWindow?PrintWindow 有什么问题?
【发布时间】:2011-09-08 15:26:24
【问题描述】:

以下代码有什么问题?为什么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);
}

【问题讨论】:

标签: winapi screenshot


【解决方案1】:

PrintWindow 是一个相当精简的操作。它真正做的是将WM_PRINT消息发布到有问题的窗口的队列中,在这种情况下是桌面,并希望该窗口能够正确响应WM_PRINT(请参阅herehere )。

我重现了你的行为,但我也不是 100% 确定它为什么会失败。也许你不能在你的进程不拥有的HWND 上调用PrintWindow,或者桌面没有响应WM_PRINT 消息。

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

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

也许这会有所帮助。

【讨论】:

  • 您的第二个链接已损坏。既然是“这里”,其他人是无法恢复的。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    替换:

    HWND hwnd = GetDesktopWindow();
    

    与:

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

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

    如果您也想获得任务栏,您仍然可以使用此方法,但您必须截取 2 个屏幕截图并将结果拼接在一起。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-09
      • 2014-08-12
      • 2010-12-23
      • 2010-10-24
      • 2011-10-04
      • 2011-10-08
      • 2013-04-07
      相关资源
      最近更新 更多