我使用的是 Microsoft Visual Studio 2010 和 Windows 7 Professional。 这是我将窗口图像复制到剪贴板的代码:
void PrintWindowEx( HWND hWnd )
{
HDC hDCMem = CreateCompatibleDC(NULL);
RECT rect;
GetWindowRect(hWnd, &rect);
HBITMAP hBmp = NULL;
HDC hDC = GetDC(hWnd);
hBmp = CreateCompatibleBitmap(hDC, rect.right - rect.left, rect.bottom - rect.top);
HGDIOBJ hOld = SelectObject(hDCMem, hBmp);
PrintWindow(hWnd, hDCMem, 0);
SelectObject(hDCMem, hOld);
DeleteObject(hDCMem);
OpenClipboard(hWnd);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hBmp);
CloseClipboard();
ReleaseDC(hWnd, hDC);
}
它适用于除 Google Chrome 主窗口之外的所有窗口。我认为是因为 Chrome 使用直接渲染,所以我在 chrome://settings
中禁用了硬件加速。仍然不起作用。然后我意识到由于 Chrome 沙盒中的限制,处理消息可能会受到限制,所以我使用 --no-sandbox
命令行选项启动了 Chrome。还是不行。
我怎样才能让它发挥作用?适用于 Chrome 和任何其他窗口,如 Chrome。 BitBlt()
是 Not Acceptable ,因为 window 窗口的某些部分可能与另一个窗口重叠,窗口可以在其他桌面上,等等。是否有任何可行的解决方案?也许将 DLL 加载到另一个进程或类似的东西。
UPD:它在 RedrawWindow()
之后重绘;所以我可以截图(一些部分 - 左边部分(宽度~20px)和右边部分不被复制)。那么,它是否支持 WM_PRINT
呢?如何截取窗口的完整屏幕截图?
最佳答案
我被困在这个问题上好久了,然后发现我可以将 PW_RENDERFULLCONTENT 参数作为最后一个参数传递给 PrintWindow。谷歌搜索显示它是 Windows 8.1 中的新功能,因此可能不适用于 7。不过可能值得一试,Winuser.h 将其定义为
#if(_WIN32_WINNT >= 0x0603)
#define PW_RENDERFULLCONTENT 0x00000002
#endif /* _WIN32_WINNT >= 0x0603 */
关于c - PrintWindow() 无法打印 Google Chrome 窗口 (Chrome_WidgetWin_1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30965343/