PrintWindow 有什么问题?

问题描述 投票:0回答:3

下面的代码有什么问题?为什么

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
3个回答
2
投票

PrintWindow
是一个相当精简的操作。它真正做的是向相关窗口(在本例中为桌面)的队列中发布一条
WM_PRINT
消息,并希望该窗口能够正确响应
WM_PRINT
(请参阅 herehere) ).

我重复了你的行为,但我也不是 100% 确定它失败的原因。也许您无法在不属于您的进程的

PrintWindow
上调用
HWND
,或者桌面可能不会响应
WM_PRINT
消息。

上面的第二个链接包含关于使用

BitBlt
代替的评论:

尝试获取句柄(HWND) 桌面窗口 - 并使用

BitBlt
捕获所有内容。提个醒 - 您只会捕获可见的内容 屏幕。

也许这有帮助。


1
投票

看起来

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

要使 PrintWindow() 工作,您可以使用

GetShellWindow()
中的 HWND,其标题为“程序管理器”(来自下图 WinSpy++)。


0
投票

更换:

HWND hwnd = GetDesktopWindow();

与:

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.