我正在尝试获取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/