打印窗口出了什么问题?

发布于 2024-11-13 07:14:13 字数 680 浏览 1 评论 0原文

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

What is wrong with the following code? Why does PrintWindow return 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);
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

聊慰 2024-11-20 07:14:13

PrintWindow 是一个相当简单的操作。它真正做的是将 WM_PRINT 消息发送到有问题的窗口(在本例中为桌面),并希望该窗口能够正确响应 WM_PRINT(如果有的话)(请参阅此处此处)。

我重复了你的行为,但我也不是 100% 确定它失败的原因。也许您无法在不属于您的进程的 HWND 上调用 PrintWindow,或者桌面可能不响应 WM_PRINT 消息。

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

尝试获取句柄 (HWND)
桌面窗口 - 并使用 BitBlt 来
捕获所有内容。请注意——
您只会捕获可见的内容
屏幕。

也许这有帮助。

PrintWindow is a fairly thin operation. What it really does is send a WM_PRINT message to the window in question, in this case the desktop, and hopes that that window will respond to WM_PRINT correctly if at all (see here and here).

I repro'd your behavior but I'm not 100% sure why it's failing either. Perhaps you cannot call PrintWindow on an HWND that your process does not own, or perhaps the desktop does not respond to WM_PRINT messages.

The second link above includes a comment about using BitBlt instead:

Try getting a handle (HWND) to the
desktop window - and use BitBlt to
capture all the contents. Mind you -
you'll only capture what is visible on
the screen.

Maybe this helps.

梦晓ヶ微光ヅ倾城 2024-11-20 07:14:13

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

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

输入图片此处描述

It looks like GetDesktopWindow() returns a virtual HWND whose value is universally 0x0010010 on all Windows machines. This virtual HWND does not conform to usual PrintWindow behavior so the PrintWindow() returns FALSE, and GetLastError() reports no error code on this PrintWindow call.

To make PrintWindow() work, you can instead use the HWND from GetShellWindow(), which has the title "Program Manager" from the WinSpy++ figure below.

enter image description here

很酷又爱笑 2024-11-20 07:14:13

替换:

HWND hwnd = GetDesktopWindow();

为:

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

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

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

Replace:

HWND hwnd = GetDesktopWindow();

With:

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

I'm not sure whether this gets what you want though. If you want to take a screenshot of the entire current desktop (including whatever top level windows are visible) then BitBlt is the route you want to take.

If you want to get the taskbar as well, you can still use this method but you'll have to take 2 screenshots and stitch the results together.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文