Win32录屏应用开发:如何捕获分层窗口下方的内容?
解决BitBlt捕获屏幕时排除自建分层悬浮窗口的问题
针对Windows 8.1及以上系统(含Win10/11)
如果你的悬浮窗口已经是分层窗口(通过SetLayeredWindowAttributes或UpdateLayeredWindow设置),直接调用SetWindowAffinity时需传入正确参数:
SetWindowAffinity(hFloatPanelWnd, WDA_EXCLUDEFROMCAPTURE);
WDA_EXCLUDEFROMCAPTURE是Windows 8.1引入的常量,传入后系统会自动将该窗口排除在包括BitBlt在内的屏幕捕获操作之外。若之前调用失败,大概率是未确认系统版本就使用该参数,或者窗口未正确设置分层属性。
针对Windows 7系统(无WDA_EXCLUDEFROMCAPTURE支持)
Win7没有官方的窗口捕获排除API,可采用以下两种方案:
- 临时隐藏窗口方案:执行BitBlt捕获前调用
ShowWindow(hFloatPanelWnd, SW_HIDE),捕获完成后立刻调用ShowWindow(hFloatPanelWnd, SW_SHOW)。这种方式实现简单,但可能出现短暂闪烁,可通过在捕获线程中同步执行隐藏-捕获-显示操作优化时序。 - 区域内容替换方案:
- 提前缓存悬浮窗口所在区域的屏幕内容:在窗口初始化或每次移动/resize后,用BitBlt捕获窗口矩形区域的底层屏幕内容,保存到临时HBITMAP中。
- 捕获整个屏幕后,将临时HBITMAP中的内容BitBlt到捕获结果的对应位置,覆盖悬浮窗口的图像。
额外注意事项
- 确保悬浮窗口已设置
WS_EX_LAYERED扩展样式,否则SetWindowAffinity无法生效(Win8.1+场景)。 - 多显示器场景下,需针对每个显示器分别处理窗口的排除或区域替换逻辑。
内容的提问来源于stack exchange,提问作者Germ
相关产品推荐
相关产品推荐

