8

如何在 WPF 应用程序运行时禁用 Print Screen 功能?

用例是我的客户希望避免从外部世界不必要地复制以患者为中心的宝贵数据,并提供物理安全性以防止人们通过非数字方式获取数据。

4

8 回答 8

5

好的,如果您的应用程序部署在用户无法使用相机的环境中,这是可能的,并且确实很有用。

首先,我使用了 RegisterHotKey 和 UnregisterHotKey API 调用,记录在此处http://pinvoke.net/default.aspx/user32.RegisterHotKey如这篇相当老的文章所述http://msdn.microsoft.com/en-美国/杂志/cc163713.aspx

我在事件中注册了IDHOT_SNAPDESKTOP热键并在. 尝试在构造函数中执行此操作给我带来了与该方法保持一致句柄的问题。Window_LoadWindow_ClosedWindowInteropHelper(this)

如果您想做的不仅仅是忽略键,您可以设置一个 Windows 消息处理程序,使用一种 WndProc,

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

如上所述制作句柄,并自己实现 WndProc。

到目前为止,我不知道如何“不”处理热键并让 Windows 执行其正常行为,当然,除了取消注册热键。

它不是很优雅或“WPF”,但它对我有用。


正如@ghord 评论

使用EnsureHandle()看起来对于在构造函数中获取处理程序很有用。

于 2011-03-14T17:23:33.913 回答
4

禁用打印是不可能的,即使可以,也很容易被手机摄像头绕过。许多都在百万像素分辨率范围内,使人们很容易获得他们想要的信息。

如果您想禁用Print Screen键盘上的键,Jodrell 的回答提供了一种方法(了解它不会阻止人们打印,并且坚定的用户会找到解决方法)。

真的,这一切都归结为信任。如果雇主不能相信他们的员工不会删除在大多数司法管辖区(美国的 HIPAA)已经受到法律保护的数据,那么就有一个更大的问题。

于 2010-10-08T10:58:34.703 回答
2

简单的:

Windows.UI.ViewManagement.ApplicationView.GetForCurrentView().IsScreenCaptureEnabled = false;
于 2017-05-02T09:24:06.450 回答
0

简单地说,你不能。“打印屏幕”只是将屏幕上的像素复制到剪贴板,而不是您的应用程序的一部分。

于 2010-10-08T11:03:27.260 回答
0

我认为 Microsoft 权限管理系统可以提供帮助。试试看。以下是链接:

微软权限管理系统

于 2010-10-08T11:50:57.960 回答
0

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

于 2010-10-08T11:17:05.727 回答
0

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

看看这个:

剪贴板事件 C#

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

于 2010-10-08T11:42:23.473 回答
0

不,没有办法做到这一点。即使您在应用程序中捕获 Print Screen 键,用户也可能将焦点设置到其他应用程序,然后执行打印屏幕(将您的应用程序放在一边等)。

唯一的方法是在后台创建一个虚拟应用程序,该应用程序使用键盘挂钩和过滤器打印屏幕捕获所有击键,但这将发生在所有应用程序上,而不仅仅是您的应用程序。而且正如乔治所说,用户也可以使用手机摄像头!

于 2010-10-08T11:44:54.870 回答