我正在尝试获取Chrome窗口的屏幕截图。看起来像这样:

当我使用 PrintWindow 获取屏幕截图时,我会在窗口标题栏/Chrome选项卡区域看到闪烁。捕获的屏幕截图包含Windows Basic风格的标题栏的奇怪渲染(即使我的机器运行的是Aero主题):

我注意到,其他一些应用程序也会在屏幕上闪烁,但在捕获的屏幕截图中看不到标题栏工件,它们也表现出类似的行为。执行此操作的应用程序包括Office 2010,IE 10和Trillian选项卡式聊天窗口-换句话说,扩展非客户端区域的窗口似乎存在此问题。

复制此代码很简单:

void Screenshot(HWND hWnd) {

    RECT rc;
    GetClientRect(hWnd, &rc);

    HDC hdcScreen = GetDC(NULL);
    HDC hdc = CreateCompatibleDC(hdcScreen);
    HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen,
        rc.right - rc.left, rc.bottom - rc.top);
    SelectObject(hdc, hbmp);

    //Print to memory hdc
    PrintWindow(hWnd, hdc, PW_CLIENTONLY);

}

为什么会看到闪烁和奇怪的视觉伪影?我该怎么做才能阻止它?

最佳答案

如果启用了Aero,请改用BitBlt。

chromium desktop capture source code中的此注释特别有用:

// When desktop composition (Aero) is enabled each window is rendered to a
// private buffer allowing BitBlt() to get the window content even if the
// window is occluded. PrintWindow() is slower but lets rendering the window
// contents to an off-screen device context when Aero is not available.

关于c++ - PrintWindow在标题栏中导致闪烁,奇怪的伪像,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19965758/

10-13 09:18