如何在WPF应用程序运行时禁用“打印屏幕”按钮?

8

当我的WPF应用程序在运行时,我该如何禁用Print Screen功能?

使用案例是,我的客户希望避免来自外部世界的有价值的以患者为中心的数据不必要的复制,并提供物理安全措施,以防止人们通过非数字手段获取数据。


是的,乔治,你说得对,市场上有相应的摄像头。但在某些情况下,我的客户希望避免将有价值的以患者为中心的数据不必要地复制到外部,并且他们已经准备好提供安全保障。 - Kishore Kumar
1
但是任何屏幕截图程序都可以在没有打印屏幕按钮的情况下保存屏幕数据。或者程序安装被阻止了? - KARASZI István
1
视频适配器中的像素可被任何程序访问。保护数据和机器是客户的问题。如果他们担心这个问题,他们可以购买定制键盘来避免这个按钮。这是一个愚蠢的问题,因为它们只是像素,而不是数据。 - Hans Passant
请求让我想起了网页上那些“无法右键点击”Javascript脚本,它们试图防止你从页面复制图片。如果您仍打算向查看屏幕的人显示数据,则无法将数据隐藏在计算机中。 - MSalters
3
这里的重点(我也遇到了同样的问题)是提供最好的解决方案。我们都知道有偷车的办法,一个好的窃贼能够偷走你的车,但是通过锁门,你可以防止小偷行窃... - David Brunelle
8个回答

5

好的,这是可能的,如果您的应用程序部署在用户无法使用摄像头的环境中,这将非常有用。

首先,我使用了RegisterHotKey和UnregisterHotKey API调用,在此处进行了记录 http://pinvoke.net/default.aspx/user32.RegisterHotKey,如此古老的文章所述 http://msdn.microsoft.com/en-us/magazine/cc163713.aspx

我在Window_Load事件中注册了IDHOT_SNAPDESKTOP热键,并在Window_Closed中取消注册。尝试在构造函数中执行此操作会导致使用WindowInteropHelper(this)方法获取一致的句柄时出现问题。

如果您想要做更多事情而不仅仅是忽略这些按键,则可以设置一个窗口消息处理程序,使用以下方式创建一种WndProc:

HwndSource source = HwndSource.FromHwnd(<handle>);
source.AddHook(<WndProc>);

制作如上所述的句柄,并自己实现WndProc。
到目前为止,我不知道如何“不”处理热键并让Windows执行其正常行为,除非注销热键。
这并不是很优雅或“WPF”,但对我有用。
作为@ghord的评论
在构造函数中使用EnsureHandle()似乎很有用,可以获取处理程序。

1
如果你在获取 Handle 时遇到问题,记得使用 EnsureHandle() 方法。 - ghord

4
无法禁用打印功能,即使可能也很容易被手机相机绕过。许多手机的像素分辨率都很高,这使得某些人可以轻松获取他们想要的信息。
如果您想禁用键盘上的“Print Screen”键,则Jodrell's answer gives a way of doing that(请注意,这并不能阻止人们打印,而且坚定的用户会找到解决方法)。
实际上,一切都归结于信任。如果雇主不能信任员工不会删除已在大多数司法管辖区(例如美国的HIPAA)受法律保护的数据,则存在更大的问题。

2

简单:

Windows.UI.ViewManagement.ApplicationView.GetForCurrentView().IsScreenCaptureEnabled = false;

1
只适用于Win RT,但很有帮助。 - ingbabic

0
简单来说,你不能这样做。 "Print screen" 只是将屏幕上的像素复制到剪贴板中,并不是你的应用程序的一部分。

有没有办法从我的应用程序中检测到是否点击了打印屏幕按钮? - Kishore Kumar
不可靠。此外,正如您后来的评论所指出的那样,这将是一种“安全”机制。也就是说,按下它的人尝试找到绕过您保护的方法。从这么不可靠的东西开始只会引诱他们完全破坏保护。 - MSalters

0
我能想到的唯一方法是使用本地的Windows API(SetWindowsHookEx)来捕获所有按键,并过滤掉PrintScreen键。但是,这将涉及创建一个本地(即非托管)DLL来实际处理按键。

0

基本上,您可以挂钩到剪贴板事件,然后如果有人这样做,则将复制的图像设置为 null。因此,他们可以复制图片,但会被重置:

看看这个:

C# 剪贴板事件

或者在定时器中,检查剪贴板的内容,并在其被设置为图片后立即清除它。


但是这可以被一个直接写入文件的截图程序所打败。 - Hans Kesting
不管怎样,它都可以被更低技术的东西战胜!重点是要禁用PrintScreen按钮,而我的解决方案虽然不是直接实现的,但也能做到。 - Aliostad

0

不行,没有办法做到。即使在您的应用程序中捕获Print Screen键,用户可能会将焦点设置到其他应用程序上,然后执行Print screen(在侧边等有您的应用程序等情况下)。

唯一的方法是在后台创建一个虚拟应用程序,使用键盘钩子捕获所有按键并过滤Print Screen,但这将发生在所有应用程序而不仅仅是您的应用程序上。而且正如George所说,用户也可以使用手机相机!


0

没有。与服务端技术无关。 - MSalters

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接