【发布时间】:2017-10-06 16:09:25
【问题描述】:
根据 msdn PrintWindow(检索日期 2017 年 5 月 5 日)
拥有 hWnd 引用的窗口的应用程序处理 PrintWindow 调用并在 hdcBlt 引用的设备上下文中呈现图像。应用程序接收 WM_PRINT 消息,或者,如果指定了 PW_PRINTCLIENT 标志,则接收 WM_PRINTCLIENT 消息。有关详细信息,请参阅 WM_PRINT 和 WM_PRINTCLIENT。
MSDN 从未声称有关消息 WM_PAINT。 但是我的测试证明了上面关于 WM_PRINT 消息的说法是错误的。
应用 A:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_PAINT:
DefWindowProc(hWnd, message, wParam, lParam);
break;
case WM_PRINT:
OutputDebugStringA("WM_PRINT");
break;
case WM_PRINTCLIENT:
OutputDebugStringA("WM_PRINTCLIENT");
break;
//other cases ...
}
return 0;
}
App B(更多关于App B的细节)
HWND hwnd = FindWindow(NULL, lpString);
//...
//PrintWindow(hwnd, hdc, PW_CLIENTONLY);
PrintWindow(hwnd, hdc, 0);
当我调用 App B 来捕获 App A 时。根据 msdn PrintWindow,应该命中大小写 WM_PRINT,但命中大小写 WM_PAINT。
如果是这样,则无法捕获未实现 WM_PAINT 的分层窗口,因为 UpdateWindow 只发送 WM_PAINT
所以最后,我只想知道是msdn错了还是我的代码错了? PrintWindow 发送消息 WM_PAINT 还是 WM_PRINT?如果它确实发送了消息 WM_PRINT,那么消息 WM_PRINT 是如何工作的?
【问题讨论】:
-
This MSDN forum entry 似乎证实了这个问题。无论如何,我不会依赖
PrintWindow()或WM_PRINT,因为它们需要来自目标窗口的合作。相反,只需从屏幕 DC 中BitBlt()。 -
如果用户 Ðаn 停下来:停止删除适当的语言标签 (c++),并添加不适当的编译器标签 (visual-c++)。谢谢。
-
也许在过去,PrintWindow 支持发送 WM_PRINT,但它改变了并且微软忘记更新文章。也许这就是它改变的原因:stackoverflow.com/a/830375/4608491