关键字:
capture minimized window
window thumbnail
IsIconic
==================== 问题背景 ======================
最小化的窗口,API GetClientRect 返回的窗口尺寸是0x0,故无法通过GetDC+BitBlt捕获到窗口画面。
但是 Agora/zoom/tencentMeeting 都可以拿到最小化窗口的缩略图。经确认这个程序并没有注入任何dll到目标窗口,且也没有临时显示最小化了的目标窗口。
如果用SHOW_RESTORE恢复最小化了的目标窗口,目标窗口是会收到WM_MOVE消息的,测试Agora/zoom/tencent抓最小化窗口的缩略图时,最小化的窗口并没有收到这个消息,事实上,目标窗口没有收到任何窗口消息。
小记:
- agora zoom 腾讯会议 在目标窗口最小化时, 都可以拿到窗口缩略图
- 拿到的该缩略图,画面和任务栏鼠标悬停时显示的缩略图一致(该缩略图并不是实时的,而是窗口最小化时刻的画面)
- 获取缩略图时,目标窗口没有收到任何窗口消息(SPY)
- 开始捕获窗口后,这几个视频会议软件 均可以恢复最小化了的窗口(即使目标窗口是管理员权限启动)
==================== 可用的方法 ====================
方法1(不推荐!)
WS_EX_LAYERED, SetLayeredWindowAttributes
方法2:
DWM接口,关键字:DwmRegisterThumbnail,DwmUpdateThumbnailProperties
通过注入Dll + hook API(DwmRegisterThumbnail)的方式验证zoom进程,发现其就是用dwm捕获最小化窗口画面的。
在zoom的窗口选择界面,所有目标窗口的画面捕获和刷新 都是用的dwm,zoom每次调用dwmRegister 传入的dest HWND都是同一个句柄,且刚刚就是窗口选择界面的顶层窗口句柄,
目标窗口最小化和restore期间,zoom没有调用过dwmUnregister,应该是调用了dwmUpdate(尚未验证)。