【问题标题】:How to trap the keyboard strokes on a c# win forms application (CTRl + alt +Del)如何在 c# win forms 应用程序上捕获键盘击键(CTRl + alt +Del)
【发布时间】:2010-11-20 12:00:49
【问题描述】:

有什么方法可以处理 Ctrl+Alt+Del 组合键。以测验应用程序(Win Forms)为例,在测试结束之前,用户应该无法切换到其他窗口。

我能够使用 c# 标准属性分别捕获 CtrlAlt 击键。但是一旦他们用户点击 Del 键。控件脱离了我的应用程序,Windows 处理它。

任何想法都会有所帮助。

谢谢。

【问题讨论】:

  • 更好的解决方案是在图书馆等地进行测试。
  • 这只是众多组合键之一... CTRL+Shift+Esc 调出任务管理器,他们可以从那里启动一个新程序。
  • 应用程序是托管在信息亭计算机上还是安装在家庭计算机上?

标签: c# .net vb.net winforms winforms-interop


【解决方案1】:

根据其他答案,似乎可以做到这一点。虽然我非常不鼓励这样做。例如,您的程序应该由于某种原因挂起(上帝保佑......)。然后你会遇到这样的情况,用户唯一能做的就是用电源按钮关闭计算机(或拔掉插头......)。

这很难做到是有充分理由的,而且这些方法的文档记录也很差......

这看起来像是要走的唯一方法,如果这是一台信息亭计算机或其他东西,则来自 Pierre-Alain Vigeant 的评论。那么这样做实际上是有意义的!

【讨论】:

  • 但是我参加了在线测试。它包含了引用的功能
  • 看RRUZ的回答,第二个链接太棒了
  • @Andomar - 是的,我查看了那个链接。解决方案是以下两种之一: 1. 禁用注册表中的任务管理器(不捕获键盘事件),这会导致出现一条消息,表明它已被禁用。 2. 编写您自己的 MyGina.dll,覆盖 Ctr + Alt + Del 的默认功能。这两种方法都是通过对系统进行永久性更改来“入侵”系统。我认为这些都不属于在测验应用程序运行期间仅禁用键序列的范围内。
【解决方案2】:

我认为这不是一个好方法。

您正在为用户开发应用程序,不应试图阻止他的一般操作。

对于 Alt+Ctrl+Del 组合键,请阅读 this 文章。

【讨论】:

  • 如果是这样的话,所有参加考试的在线学生都可以从google(通过更改浏览器)获得答案。
  • 他们可以使用另一台机器或一本书来获得答案。
  • 可以处理对另一台机器或一本书的访问。不阻止 Ctrl-Alt-Del 并允许他们运行浏览器实例太容易了。
  • 以某种方式禁用将运行测试的机器上的浏览器不是更方便吗?让他们以“只能”运行您的测试的用户身份登录...
  • 如果用户除了参加考试之外不允许做任何事情怎么办。?那会更有意义。
【解决方案3】:

AFAIK,Ctrl+Alt+Del 会产生硬件中断,无法通过软件应用程序处理。可能这可以通过系统级键盘挂钩来处理,但我也不太确定。

【讨论】:

    【解决方案4】:

    看看这里:

    http://www.thescarms.com/vbasic/StopReBoot.aspx

    本质上,对于 Win9x,我们会欺骗系统认为屏幕保护程序正在运行(这会禁用 Ctrl-Alt-Delete 序列),而对于 WinNT,我们会重新映射键盘。

    【讨论】:

      【解决方案5】:

      嗯,没有真正答案的老话题。

      短版:

      • 您需要使用驱动程序来捕获系统击键
      • 为此,请使用Interception Api,它为此目的提供签名驱动程序。
      • 为了能够使用Interception,您需要下载并安装 WDK(Windows Driver Kid)
      • 要测试您的程序,请使用带有测试系统的虚拟机。您不想在正在运行的生产系统中测试驱动程序。

      长版:

      是的,这是可能的。为了能够拦截这些组合键,您需要在内核层提供键盘驱动程序。解释原因:通常在 Windows 中有两种不同类型的击键。有系统击键(WM_SYSKEYDOWN 或 WM_SYSKEYUP)和非系统击键(WM_KEYDOWN 或 WM_KEYUP)。只有非系统击键可以被钩子中断。这些击键消息在驱动程序中生成,然后传递到系统消息队列中。如果 WM_SYSKEYDOWN 或 WM_SYSKEYUP 在此队列中,则无法在 Windows 自行处理之前将其删除。

      如何防止将系统击键推送到 SMQ?提供一个签名的驱动程序来过滤这些。自己创建和签署驱动程序并不是您能做的最简单的事情。但是我们可以使用一些 API。 例如:来自 oblita 的Interception。该 api 提供签名的驱动程序来与键盘或较低的驱动程序交互。

      windows下按键事件参考:https://msdn.microsoft.com/en-us/library/windows/desktop/ms646267(v=vs.85).aspx

      【讨论】:

        【解决方案6】:

        将 Form.TopMost 设置为 true,每毫秒调用一次 Form.Activate() 并提高进程和入口线程的优先级。

        (看看你的应用程序崩溃的可怜用户。)

        【讨论】:

        • 这对 Control+Alt+Del 问题没有帮助。
        猜你喜欢
        • 2014-09-12
        • 2010-11-23
        • 2011-02-17
        • 2011-06-30
        • 2015-11-15
        • 2011-05-05
        • 1970-01-01
        • 2014-01-13
        • 2011-01-15
        相关资源
        最近更新 更多