win7aero主题隐藏主窗口后截取桌面仍然存在主窗口的残影

琳琳天天 2019-04-30 02:16:20
背景:IM软件内开发截图工具,有个需求就是在截图之后隐藏主窗口然后截取桌面,在win7的basic主题下会高概率的出现主窗口的残影,但在aero主题下没这个问题

截图接口:QWindowsScreen::grabWindow
具体内部实现:
QPixmap QWindowsScreen::grabWindow(WId window, int x, int y, int width, int height) const
{
RECT r;
HWND hwnd = window ? reinterpret_cast<HWND>(window) : GetDesktopWindow();
GetClientRect(hwnd, &r);

if (width < 0) width = r.right - r.left;
if (height < 0) height = r.bottom - r.top;

// Create and setup bitmap
HDC display_dc = GetDC(0);
HDC bitmap_dc = CreateCompatibleDC(display_dc);
HBITMAP bitmap = CreateCompatibleBitmap(display_dc, width, height);
HGDIOBJ null_bitmap = SelectObject(bitmap_dc, bitmap);

// copy data
HDC window_dc = GetDC(hwnd);
BitBlt(bitmap_dc, 0, 0, width, height, window_dc, x, y, SRCCOPY | CAPTUREBLT);

// clean up all but bitmap
ReleaseDC(hwnd, window_dc);
SelectObject(bitmap_dc, null_bitmap);
DeleteDC(bitmap_dc);

const QPixmap pixmap = qt_pixmapFromWinHBITMAP(bitmap);

DeleteObject(bitmap);
ReleaseDC(0, display_dc);

return pixmap;
}


目前分析:aero主题注重外观,basic注重系统运行速度,在渲染方面aero效果较佳。上述代码中// copy data
HDC window_dc = GetDC(hwnd);
BitBlt(bitmap_dc, 0, 0, width, height, window_dc, x, y, SRCCOPY | CAPTUREBLT);
如果在这段代码前面加Sleep(100)出现截图程序主窗口残留的问题会降低非常多,但是还是有概率出现。有人知道具体原因吗,有啥方案可以规避。参考了竞品微信和钉钉都没这个问题。
...全文
113 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgl7903 2019-04-30
  • 打赏
  • 举报
回复
把 HDC window_dc = GetDC(hwnd); BitBlt(bitmap_dc, 0, 0, width, height, window_dc, x, y, SRCCOPY | CAPTUREBLT); // clean up all but bitmap ReleaseDC(hwnd, window_dc); 这一段 用 PrintWindow 试试看, 有可能窗口还没有刷新

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧