PrintWindow()无法打印Google Chrome窗口(Chrome_WidgetWin_1)

我正在使用Microsoft Visual Studio 2010和Windows 7专业版。 这是我的代码复制窗口图像剪贴板:

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 Sandbox中的限制,使用消息可能会受到限制,所以我使用--no-sandbox命令行选项启动了Chrome。 依然不起作用。

我怎样才能使这个工作? 对于Chrome和Chrome等其他窗口。 BitBlt()是不可接受的,因为窗口的某些部分可能会被另一个窗口重叠,窗口可能在其他桌面上,等等。是否有任何工作的解决scheme? 也许与DLL加载到另一个进程或类似的东西。

UPD :它在RedrawWindow()之后重绘。 所以我可以截图(有些部分 – 左边部分(宽度~20px),右边部分不会被复制)。 那么,它是否支持WM_PRINT ? 我怎样才能完整的截图窗口?

我被困在这个年龄,然后发现我可以传递一个参数PW_RENDERFULLCONTENT作为PrintWindow的最后一个参数。 谷歌搜索显示它在Windows 8.1中是新的,所以可能不工作。它可能值得尝试,但Winuser.h定义为

 #if(_WIN32_WINNT >= 0x0603) #define PW_RENDERFULLCONTENT 0x00000002 #endif /* _WIN32_WINNT >= 0x0603 */ 

PrintWindow通过向目标窗口发送WM_PRINT或WM_PRINTCLIENT来工作。 当DefWindowProc处理标准窗口类的WM_PRINT ,自定义窗口类必须处理WM_PRINT ,以使PrintWindow产生所需的结果。 如果Chrome不处理WM_PRINTWM_PRINTCLIENT ,那么您就无能为力了。

针对Windows Vista及更高版本时,可以使用DWM缩略图 API强制窗口将其内容呈现到客户端提供的目标窗口中。