Windows反截屏开发实现
最近在我们云桌面中需要做到反截屏能力,所谓反截屏就是我们无法通过截图软件(微信,QQ,截图等程序)截取桌面的内容。在Windows下面我们通过如下步骤来截图:
- 通过
GetDC
或者CreateDC
来获取DC。 - 通过
CreateCompatibleDC
创建内存DC。 - 通过
BitBlt
/StretchBlt
将屏幕DC的内容拷贝到内存DC中。 - 我们将DC的位图提取出来,就完成了截图。
要做到反截屏,一般有两种方式来实现:
- 通过设置属性,是的第三方软件无法获取到窗口的内容。
- 对截图的行为进行拦截,例如
CreateCompatibleDC
或者BitBlt
/StretchBlt
等。
接下来分别对两种情况来进行处理。
1. SetWindowDisplayAffinity
SetWindowDisplayAffinity
该函数设置窗口的显示属性,该函数如下:
BOOL SetWindowDisplayAffinity(
HWND hWnd,
DWORD dwAffinity
);
对于dwAffinity
可以取值如下:
WDA_MONITOR
设置窗口只在显示器上面显示,我们从内存DC中那窗口的内容的话得到的是空的。WDA_NONE
移除只在显示器上面显示的标记属性。
其实还有一个标记WDA_EXCLUDEFROMCAPTURE
专门是为截图设计的,当设置这个标记的时候,就会导致该窗口截图的时候透明。
该函数是在DWM窗口合成中完成的,因此需要在DWM开启的情况下才能生效;我们可以大致实现如下:
void CWindowAffinityDlg