通过ProcessCmdKey捕获密钥序列

时间:2011-10-30 11:05:07

标签: c# keyboard

我在我的应用程序中覆盖了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中捕获了大量快捷方式,因此我宁愿不必再次启动

由于

1 个答案:

答案 0 :(得分:3)

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

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

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

第2步:将此按键存储在您创建的新课程中,以跟踪上次按键操作。

KeyPressTracker.Store(KeyCode, Modifiers);

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

var lastKeyPress = KeyPressTracker.GetLastKeyPress();

if (lastKeyPress == "Ctrl+R" && currentKeyPress == "Ctrl+M")
{   
    // Show Refactor dialog
}