KeyDown:识别多个键

34 c# ctrl keydown

KeyDown该如何判断是否CtrlUp被按下了.

private void listView1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Control && e.KeyCode == Keys.Up)
    {
        //do stuff
    }
}    
Run Code Online (Sandbox Code Playgroud)

因为永远不会在同一秒内完全按下两个键,所以无法工作.你总是一开始Ctrl然后另一个......

Gar*_*ler 30

您可以检查KeyEventArgs的修饰符,如下所示:

private void listView1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Up && e.Modifiers == Keys.Control)
    {
        //do stuff
    }
}  
Run Code Online (Sandbox Code Playgroud)

MSDN参考

  • 在我的键盘上永远不会这样 - 例如,如果我按下LShiftKey和Keys.Up,它将永远不会成为e.Shift,并且e.Modifiers将始终保持无.知道为什么吗? (3认同)
  • 似乎箭头键在某种程度上是特殊的.这个问题提供了一些见解:http://stackoverflow.com/questions/1646998/up-down-left-and-right-arrow-keys-do-not-trigger-keydown-event (2认同)

Mat*_*ton 13

KeyEventArgs上MSDN页面:

if (e.KeyCode == Keys.F1 && (e.Alt || e.Control || e.Shift))
{
    //Do stuff...
}
Run Code Online (Sandbox Code Playgroud)


Ior*_*nev 7

KeyEventArgs有属性Ctrl,AltShift显示是否按下这些按钮.


小智 5

您可以尝试使用该Keyboard对象来检测IsKeyDown属性.此外,如果您不希望浏览器快捷方式覆盖,则可以将Handled属性设置为true.但是在覆盖浏览器快捷方式时要小心,因为它可能会导致混淆.

private void Page_KeyDown(object sender, KeyEventArgs e)
{
    // If leftCtrl + T is pressed autofill username
    if (Keyboard.IsKeyDown(Key.T) && Keyboard.IsKeyDown(Key.LeftCtrl))
    {
        txtUser.Text = "My AutoFilled UserName";
        e.Handled = true;
    }
}
Run Code Online (Sandbox Code Playgroud)


Nik*_*iko -2

你必须记住按下的键(即在布尔数组中)。并在按下(keydown)时将位置设置为 1,在 up 时将位置设置为 0。

这样您就可以跟踪多个密钥。我建议只为特殊键创建一个数组

所以你可以这样做:

 if (e.KeyCode == Keys.Control)
 {
        keys[0] = true;
 }
// could do the same with alt/shift/... - or just rename keys[0] to ctrlPressed

if (keys[0] == true && e.KeyCode == Keys.Up)
 doyourstuff
Run Code Online (Sandbox Code Playgroud)