【问题标题】:How to detect Ctrl+Shift+Numeric Keypad in WinForms application如何在 WinForms 应用程序中检测 Ctrl+Shift+数字小键盘
【发布时间】:2019-07-15 08:10:34
【问题描述】:

我希望能够允许我的应用程序的用户按 Ctrl+Shift+数字键盘键在我正在开发的应用程序中充当导航快捷方式。令我惊讶的是,它似乎无法识别这个组合键。

按 Shift+小键盘可激活大多数键盘上显示的扩展功能,例如光标键(在 2、4、6 和 8 上)、向下/向上翻页(在 3 和 9 上)、结束/主页(在 1 和 7 上) ) 等。

WinForms 中的各种键事件准确地报告这些事件,就好像它们是实际按下的光标键等一样。因此,我无法区分例如Shift+KeyPad4 和 CursorLeft。我不能简单地寻找 Ctrl+CursorLeft 而不是 Ctrl+Shift+KeyPad4,因为人们可能会使用 Ctrl+CursorLeft 来进行文本编辑。

有什么方法可以正确检测这些移位的数字键盘键盘组合?

谢谢!

【问题讨论】:

    标签: c# winforms keypress


    【解决方案1】:

    使用一个类来跟踪按下了哪些键。 当您收到 OnKeyDown 事件时,将该键存储为 down,然后当您收到 OnKeyUp 事件时,将该键从存储中移除。

    然后在同一个OnKeyDown 事件中,在存储按键后,检查您期望的所有三个键是否都已按下。

    看起来像这样:

    public void OnKeyDown(EventArgs ...) {
        _keyStore.KeyDown(eventArgs.keyPress);
    
        if(_keyStore.AltCtrlKeyPad4IsDown()) { //Abstract this so you can perform multiple checks.
            //Do shortcut.
        }
    
    }
    
    public void OnKeyUp(EventArgs ...) {
        _keyStore.KeyUp(eventArgs.keyPress);
    }
    

    请注意,这是 sudo 代码,不会编译。

    【讨论】:

    • 如果您将位标志用于几件事,这可能会更酷。例如,您的修饰符可以是一组位标志,而键是另一个枚举数。这将使您不必为所有内容编写大量方法。不过,绝对喜欢这个答案的整体格式。
    • 感谢您的建议,不幸的是我找不到这些方面的解决方案。我监视了 Shift 和 Ctrl 键,并在数字键盘中按下(例如)“4”时检查了这些键。结果如下:我按住 Shift:_shift 标志被设置。我按住 Ctrl:设置了 _ctrl 标志。我按小键盘 4:三个键事件依次触发:Shift 被释放,CursorLeft 被按下,Shift 被再次按下。因此,我仍然无法区分用户按下 Ctrl+Shift+numpad4 和按下 Ctrl+CursorLeft。很郁闷...
    • 请说明您想用作事件快捷方式的组合键。
    • 根据我的原始帖子,我想捕获 Ctrl+Shift+数字键盘键。 Shift+numeric-keypad 的组合返回它们的替代功能键(例如,光标左/右/上/下),而不是反映实际在键盘上按下的任何组合。因此,我无法区分(例如)Ctrl+Shift+numeric-keypad-4 和 Ctrl+CursorLeft。
    • 听起来您想绕过运行时抽象并实现一个低级挂钩来捕获输入。如果您从中获得相同的输入,那么这将是硬件级别的限制。 (即键盘)stackoverflow.com/questions/604410/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多