Amo*_*ogh 11 c# directx winapi direct3d win32gui
在开发检查软件时,我有一个要求防止通过TeamViewer,AnyDesk,Ammyy Admin等应用程序共享桌面,或者至少阻止对其进行检测。我们的考试软件是用C#开发的,它是一种winform逐一呈现问题。
我不认为检测如此简单,因为它们有多种捕获屏幕桌面复制API,BitBlt,Direct3D,DirectX,DirectShow等方法。
因此,我开始探索如何防止在启动桌面共享时显示我的c#winform。为此,到目前为止,我已经尝试了以下操作:
SetWindowDisplayAffinity
为WDA_MONITOR
对Winform 启用保护的桌面组合来利用DWM(停止窗口管理器)。通过在我开始桌面共享时执行此操作,远程控制的计算机可以看到表单上的黑色层。但是,并非所有桌面共享应用程序都具有相同的行为。就像TeamViewer的行为一样,但Ammyy Admin的行为却像AnyDesk。某些应用程序如何显示黑层而有些则不显示?我还能做些什么吗? if (winForm != null)
{
if (Protect)
result = SetWindowDisplayAffinity(winForm.Handle, WDA_MONITOR);
else
result = SetWindowDisplayAffinity(winForm.Handle, WDA_NONE);
}
Run Code Online (Sandbox Code Playgroud)
我编码的这种方法并不完全适用于所有桌面共享应用程序,因此,是否有100%的解决方案可以防止/检测桌面共享?
如果您尝试了VLC播放器的“ DirectX(DirectDraw)视频输出”,那么此输出方法也将执行相同的操作SetWindowDisplayAffinity
,当启动任何桌面共享应用程序时,它将在视频上显示黑色图层,而我测试了该功能是否可与将近9种桌面共享应用程序一起使用知道怎么做?可以用c#winform完成吗?
更新29-05-2019
检查VLC代码后,我知道它们正在使用DirectDraw进行硬件覆盖。因此,我创建了vc ++项目并使用d3d9并创建了具有红色表面的覆盖,现在,如果我将机器移开,则红色的表单将显示黑色。答对了!!解决了一半问题。
现在,我正在尝试为该窗口设置透明度,以便覆盖将在我的C#应用程序的顶部,并且考生可以进行考试,如果进行远程考试,则覆盖将以黑色显示。为了使窗口透明,我使用了DwmExtendFrameIntoClientArea
winapi,但是现在在远程也可以将其显示为透明。有什么办法吗?
我想将其添加为答案,因为很多讨论都是在评论中进行的,这些讨论被转移到聊天中,所以我想对其进行总结,以便即将到来的观众能够了解讨论和我最终得到的解决方案。
首先我想弄清楚VLC的“DirectX(DirectDraw)视频输出”是如何工作的?VLC 的这种特殊输出模式使用 DirectDraw 创建硬件覆盖并在其上播放视频。虽然屏幕捕获(不是从移动设备或外部摄像头),大多数捕获机制通过请求 GDI 来捕获屏幕,但硬件覆盖直接在 GPU 上渲染,而 GDI 无法访问 GPU。就像GDI->CPU+RAM,DirectX->GPU+VRAM,这就是为什么在屏幕捕获中VLC的视频播放部分显示为黑色。欲了解更多信息/sf/answers/1507467811/
但正如 RomanR. 在聊天中提到“使用用于视频的覆盖层无助于隐藏应用程序的用户界面”。
我也确认了这一点,正如我在更新中提到的,我创建了一个 vc++ 项目,如果我在上面播放视频,则使用 D3D9 创建硬件覆盖层,然后在屏幕录制中显示黑色区域,但我没有找到任何方法使该覆盖层透明这样它就可以放在我的应用程序上或将应用程序内容放在覆盖层上,以便在录制屏幕时应用程序内容将不可见。
Riddel 提出了“反病毒程序的工作方式和迭代所有进程以及哈希检查常见屏幕共享工具的方式”的新想法,但我个人认为这不会是通用解决方案,因为我必须维护此类应用程序的列表及其哈希值,如果发现任何新的应用程序,则更新该列表。此外,任何人都可以编辑字节来破坏哈希值,从而使此错误。
我接受的解决方案:
Windows API 提供了一种功能,可以帮助仅在监视器上显示窗口的内容。也就是说SetWindowDisplayAffinity
,这就像魅力一样!!
最低支持操作系统的问题:
尽管 MSDN 文档提到“最低支持的客户端::Windows 7”,但在 Windows 7 上,它并不适用于所有屏幕捕获应用程序。罗曼·R. 在评论中说:“这将从 Windows 8(也可能是 Windows 7 的平台更新)开始正常工作。在纯 Windows 7 上,您将面临免费的桌面共享,并且无法保护您的内容。”
所以目前,我已经完成了SetWindowDisplayAffinity
将其实现为:
private const uint WDA_NONE = 0x0;
private const uint WDA_MONITOR = 0x1;
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern bool SetWindowDisplayAffinity(IntPtr hWnd, uint dwAffinity);
public static bool SetDRM(Form winForm, bool Protect)
{
bool result = false;
if (winForm != null)
{
if (Protect)
result = SetWindowDisplayAffinity(winForm.Handle, WDA_MONITOR);
else
result = SetWindowDisplayAffinity(winForm.Handle, WDA_NONE);
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
543 次 |
最近记录: |