如何在WPF中运行我的应用程序时禁用“PRINT SCREEN”按钮?

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

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

禁止打印是不可能的,即使有可能,手机相机也很容易避开打印 。 许多都在百万像素分辨率范围内,这使得某人很容易获得他们想要的信息。

如果你想在你的键盘上禁用Print Screen Key, Jodrell的答案就会提供一种方法 (理解它不会阻止人们进行打印,并且一个坚定的用户会找到解决方法)。

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

好的,如果您的应用程序部署在用户无法使用摄像头的环境中,那么它是可能的,而且确实很有用。

首先,我使用了RegisterHotKey和UnregisterHotKey API调用,这里记录了http://pinvoke.net/default.aspx/user32.RegisterHotKey ,如这篇相当古老的文章所述http://msdn.microsoft.com/en-我们/ magazine / cc163713.aspx 。

我在Window_Load事件中注册了IDHOT_SNAPDESKTOP热键,并在Window_Load中注销了它。 尝试在构造函数中执行此操作使我WindowInteropHelper(this)使用WindowInteropHelper(this)方法获得一致的句柄。

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

 HwndSource source = HwndSource.FromHwnd(); source.AddHook(); 

如上所述制作句柄,以及自己的WndProc实现。

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

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


正如@ghord评论

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

简单:

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

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

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

看看这个:

剪贴板事件C#

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

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

唯一的方法是在后台创建一个虚拟应用程序,使用键盘钩子和filter打印屏幕捕获所有击键,但这将发生在所有应用程序而不仅仅是你的。 而且乔治说用户也可以使用手机相机!

我认为Microsoft Rights Management System可以提供帮助。 试试看。 以下是链接:

微软权利管理系统

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