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

标签 c windows google-chrome winapi window

我使用的是 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/

相关文章:

javascript - 使用 Chrome API 将文件保存到 USB

c - 需要帮助为 C 中的内存匹配游戏生成随机字符

c - 如何知道编译器正在编译的函数的位置

windows - DDE:实现通过 Shell 和 ddeexec 正确启动的应用程序

css - chrome 开发者模式样式侧边栏不再链接 css

JavaScript Chrome 与 IE

c++ - 让子窗口继承父背景颜色?

c - 通过服务器和客户端之间的网络传递原始结构

C++ : Disabling a device driver in Windows

windows - 如何更改 Bash for Windows 10 中的默认目录?