我有一个 winform 应用程序,我想在执行此应用程序时禁用某些组合键。
我要禁用除Ctrl+Esc
以外的所有组合键{Alt+Tab
,WinKeys
,Ctrl+Alt+Delete
等)。
我使用c#
进行编程。
谢谢。
答案 0 :(得分:3)
正确的方法是不使用C#(或任何编程语言)。
相反,您需要利用Windows对有限用户帐户和其他安全相关规定的内置支持。您可以将计算机锁定得如此紧密,以至于用户无法执行任何操作。这种类型的事物由组策略控制,而不是单个应用程序应该具有任何控制权的东西。
您可以在另一个处理此类问题的Stack Exchange网站Server Fault上询问有关组策略配置和锁定Windows计算机的更多问题。但我建议首先进行搜索,看看你的问题是否已在那里得到解答!
如果您绝对必须在C#中执行此操作,那么您唯一的解决方案将是一个低级键盘钩子。首先,因为这是您可以在C#中创建的唯一类型的挂钩,其次是因为您需要能够在任何其他应用程序(包括操作系统本身)接收和处理它们之前拦截并丢弃按键。
在问题中明确排除了Ctrl + Alt + Delete是一件好事,因为即使使用低级别的键盘钩子,你也无法限制那个。
您会找到一个示例实现here on Stephen Toub's blog。
诀窍是你不会为你想要丢弃的按键调用CallNextHookEx()
函数,这会阻止事件信息传递给下一个应用程序钩链。根据{{1}}的{{3}}:
调用CallNextHookEx是可选的,但强烈建议;否则,已安装挂钩的其他应用程序将不会收到挂钩通知,因此可能会出现错误行为。除非您绝对需要阻止其他应用程序看到通知,否则您应该调用CallNextHookEx。
因此,您需要确保执行调用该功能以进行正常键盘输入,但不表示您希望丢弃该功能。而不是CallNextHookEx()
,您需要返回1 - CallNextHookEx
。
在示例代码中,所有这些都将在new IntPtr(1)
方法中发生,每次收到键盘事件时都会调用该方法。在HookCallback
值(使用已按下的键的documentation)上使用switch
语句来确定要拒绝的输入。