如果其中一个键是Alt,Control或Shift,则无法获得Windows窗体组合键

时间:2014-09-05 09:08:34

标签: c# winforms combinations

我的程序有几个键组合,但每当按下Shift,Alt或Control时,它们都会覆盖不是其中任何一个键的任何其他键,即使它们没有相互覆盖。有人可以帮我找到一种方法来确保KeyEventArgs(或一些等效函数)同时获得两者,例如Shift + W?在下面的代码中,无论我是通过按住W还是Shift开始,我都只获得移动写字线,而不是组合。

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Shift)
    {
        if (e.KeyData == Keys.W || e.KeyData == Keys.S)
        {
            Console.WriteLine("combination");
        }
        Console.WriteLine("shift");
     }
}

1 个答案:

答案 0 :(得分:1)

KeyData属性公开了按以及作为活动修饰符的键。所以你会这样使用它:

private void Form1_KeyDown(object sender, KeyEventArgs e) {
    if (e.KeyData == (Keys.Shift | Keys.W) || e.KeyData == (Keys.Shift | Keys.S)) {
        Console.WriteLine("combination");
    }
 }

您也可以按照自己的方式进行操作,但之后必须使用其他属性KeyCode。它只显示密钥代码而不用修饰键:

private void Form1_KeyDown(object sender, KeyEventArgs e) {
    if (e.Shift) {
        Console.WriteLine("shift");
        if (e.KeyCode == Keys.W || e.KeyCode == Keys.S) {
            Console.WriteLine("combination");
        }
    }
 }

你使用哪一件完全取决于你。但请记住,使用表单的KeyDown事件不是很正确。它还需要将KeyPreview属性设置为true。这是一个非常丑陋的VB6兼容性属性,你无法看到每一个可能的击键。导航键被过滤,就像在VB6中完成的那样。本机Winforms方式是重写ProcessCmdKey()方法。哪个 要求您使用KeyData。