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