You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)。这种方式实现简单,但可能出现短暂闪烁,可通过在捕获线程中同步执行隐藏-捕获-显示操作优化时序。
  • 区域内容替换方案:
    1. 提前缓存悬浮窗口所在区域的屏幕内容:在窗口初始化或每次移动/resize后,用BitBlt捕获窗口矩形区域的底层屏幕内容,保存到临时HBITMAP中。
    2. 捕获整个屏幕后,将临时HBITMAP中的内容BitBlt到捕获结果的对应位置,覆盖悬浮窗口的图像。

额外注意事项

  • 确保悬浮窗口已设置WS_EX_LAYERED扩展样式,否则SetWindowAffinity无法生效(Win8.1+场景)。
  • 多显示器场景下,需针对每个显示器分别处理窗口的排除或区域替换逻辑。

内容的提问来源于stack exchange,提问作者Germ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 09:12:52