【问题标题】:Capture Key Sequence via ProcessCmdKey通过 ProcessCmdKey 捕获键序列
【发布时间】:2011-12-18 04:13:33
【问题描述】:

我在我的应用程序中覆盖 ProcessCmdKey,并且可以使用修饰符(例如 Alt+Ctrl+X)获得任何单个按键。我想要做的是模仿说 ReSharper 的快捷方式处理,其中用户按住控制键,然后按 R、M 来打开重构对话框

我找到了很多关于捕获键加修饰符组合的参考,但对于序列而言却不多。有这个Capture multiple key downs in C#,但它使用 KeyDown 事件。

还有一些关键的挖掘示例,例如 http://www.codeproject.com/KB/system/simple_key_log.aspx,它们捕获所有内容并使用本地调用。

我是否能够扩展我的 ProcessCmdKey 来处理按键序列,或者我需要寻找其他地方吗?由于我在 ProcessCmdKey 中捕获了大量快捷方式,因此如果可能,我宁愿不必重新开始

谢谢

【问题讨论】:

    标签: c# keyboard


    【解决方案1】:

    为了实现您想要的功能,您只需跟踪KeyPress 事件的顺序。

    您可以创建一个类来跟踪在ProcessCmdKey 中按下的最后一个组合键。如果该特定组合与映射命令不匹配,但它是序列的第一个元素,则可以将其存储在类中。然后在下次激活ProcessCmdKey 时检查您的新KeyPressTracker 类以确定序列是否已启动。如果有,则检查新按下的组合键是否是您指定的组合键的第二个元素。请看下面的伪代码示例:

    第 1 步: ProcessCmdKey 已激活。组合键是 Ctrl+R,这与您要处理的命令不匹配,但它是您要使用的序列的第一个元素(Ctrl+R+M)。

    第 2 步:将此按键存储在您创建的新类中,以跟踪最后一次按键。

    KeyPressTracker.Store(KeyCode, Modifiers);
    

    第 3 步: ProcessCmdKey 被第二次激活。这一次,组合键是 Ctrl+M,这不是我们要查找的按键,而是序列的第二个元素。我们使用新的KeyPressTracker 类检查最后存储的按键。这将允许您匹配“序列”,例如 Ctrl+RCtrl+M

    var lastKeyPress = KeyPressTracker.GetLastKeyPress();
    
    if (lastKeyPress == "Ctrl+R" && currentKeyPress == "Ctrl+M")
    {   
        // Show Refactor dialog
    }
    

    【讨论】:

    • 谢谢,我一定会试试的
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-12
    相关资源
    最近更新 更多