如何在WPF应用程序运行时禁用“打印屏幕”功能?
用例是我的客户希望避免不必要地复制来自外部世界的有价值的以患者为中心的数据,并且它们提供物理安全性以防止人们通过非数字手段获取数据。
答案 0 :(得分:5)
好的,如果您的应用程序部署在用户无法使用相机的环境中,则可能会有用。
首先,我使用了RegisterHotKey和UnregisterHotKey API调用,这里记录了http://pinvoke.net/default.aspx/user32.RegisterHotKey,正如这篇相当古老的文章http://msdn.microsoft.com/en-us/magazine/cc163713.aspx中所述。
我在IDHOT_SNAPDESKTOP
事件中注册了Window_Load
热键,并在Window_Closed
中注销了该热键。尝试在构造函数中执行此操作会让我无法使用WindowInteropHelper(this)
方法获得一致的句柄。
如果你想做的不仅仅是忽略键,你可以设置一个Windows消息处理程序,使用一种WndProc,
HwndSource source = HwndSource.FromHwnd(<handle>);
source.AddHook(<WndProc>);
如上所述制作句柄,以及自己的WndProc实现。
到目前为止,我还不知道如何“不”处理热键并让Windows执行其正常行为,当然,除非注销热键。
它不是很优雅或“WPF”,但它对我有用。
正如@ghord评论
EnsureHandle()
的使用对于在构造函数中获取处理程序非常有用。
答案 1 :(得分:4)
无法禁用打印,即使可能,也很容易被手机摄像头规避。许多都处于百万像素分辨率范围内,这使得某人很容易获得他们想要的信息。
如果您想要禁用键盘上的Print Screen
键,Jodrell's answer gives a way of doing that(了解它不会阻止人们进行打印,并且确定的用户会找到解决方法)。
真的,这一切都取决于信任。如果雇主不能相信他们的员工不会删除大多数司法管辖区已经受到法律保护的数据(美国的HIPAA),那么就会有一个更大的问题。
答案 2 :(得分:1)
易:
mycontacts[$index]
答案 3 :(得分:0)
简单来说,你做不到。 “打印屏幕”只是将屏幕上的像素复制到剪贴板,而不是应用程序的一部分。
答案 4 :(得分:0)
我能想到的唯一方法是使用本机Windows API(SetWindowsHookEx)来捕获所有击键并过滤掉PrintScreen键。然而,这将涉及创建本机(即,非托管)DLL以实际进行击键处理。
答案 5 :(得分:0)
基本上你可以挂钩到ClipBoard事件,然后将图像复制为null,如果有人这样做的话。所以他们可以复制图像,但它会被重置:
看看这个:
或者在计时器中,检查剪贴板的内容,并在设置为图片后立即将其清除。
答案 6 :(得分:0)
不,没办法那样做。即使您在应用程序中捕获“打印屏幕”键,用户也可能将焦点设置为其他应用程序,然后执行“打印”屏幕(将应用程序放在一边等)。
唯一的办法是在后台创建一个虚拟应用程序,它使用键盘挂钩和过滤器打印屏幕捕获所有击键,但这将适用于所有应用程序而不仅仅是你的应用程序。而且乔治说用户也可以使用手机摄像头!
答案 7 :(得分:0)
我认为微软版权管理系统可以提供帮助。试试看。以下是链接: