c# - 如何禁用热键(ctrl + alt + delete除外)

时间:2011-12-19 10:19:40

标签: c# winforms keyboard hook

我有一个 winform 应用程序,我想在执行此应用程序时禁用某些组合键。

我要禁用除Ctrl+Esc以外的所有组合键{Alt+TabWinKeysCtrl+Alt+Delete等)。

我使用c#进行编程。

谢谢。

1 个答案:

答案 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语句来确定要拒绝的输入。