KeyDown:识别多个键

时间:2009-08-12 11:40:02

标签: c# keydown ctrl

如何在KeyDown中确定按下了 Ctrl Up

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

无法正常工作,因为永远不会在同一秒内完全按下两个键。你总是先找到 Ctrl 然后另一个......

13 个答案:

答案 0 :(得分:28)

您可以像这样检查KeyEventArgs的修饰符:

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

MSDN reference

答案 1 :(得分:10)

来自MSDN page on KeyEventArgs

if (e.KeyCode == Keys.F1 && (e.Alt || e.Control || e.Shift))
{
    //Do stuff...
}

答案 2 :(得分:7)

KeyEventArgs中有属性 Ctrl Alt Shift ,显示是否按下了这些按钮。

答案 3 :(得分: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;
    }
}

答案 4 :(得分:2)

您可以使用ModifierKeys属性:

if (e.KeyCode == Keys.Up && (ModifierKeys & Keys.Control) == Keys.Control)
{
    // CTRL + UP was pressed
}

请注意,ModifierKeys值可以是值的组合,因此,如果要检测 CTRL ,而不管 SHIFT 的状态如何ALT 键,您需要执行按位比较,如上面的示例所示。如果你想确保没有按下其他修饰符,你应该检查是否相等:

if (e.KeyCode == Keys.Up && ModifierKeys == Keys.Control)
{
    // CTRL + UP was pressed
}

答案 5 :(得分:2)

private void listView1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Up && Keyboard.IsKeyDown(Key.LeftCtrl))
    {
         //do stuff
    }
}

此代码仅在您按下第一个LeftCtrl,然后按" UP"时才有效。 如果订单没有重要性,我建议一个:

if ((Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))&& Keyboard.IsKeyDown(Key.Z))
{
    //do stuff
}

在这种情况下,会同时考虑Ctrl,而不重视订单。

答案 6 :(得分:1)

我测试了以下代码。它有效...

private void listView1_KeyDown(object sender, KeyEventArgs e)
    {
        if ((int) e.KeyData == (int) Keys.Control + (int) Keys.Up)
        {
            MessageBox.Show("Ctrl + Up pressed...");
        }
    }

答案 7 :(得分:0)

这肯定会奏效。小心处理KeyUp事件,而不是keyDown

private void mainForm_KeyUp(object sender, KeyEventArgs e)
    {
        if (e.Modifiers == Keys.Control && e.KeyCode == Keys.A)
        {
             //insert here
        }
    }

对我而言,keyDown无效,keyU p代替相同的代码。

我不知道为什么,但似乎因为keyDown事件在你按任意键后直接发生,即使那是 ctrl 键,所以如果你按了 ctrl + Up 您将在 UP 键之前按 ctrl 键,因此事件将在您按下另一个之前发生,同时按第二个键将再次触发事件。

虽然在释放密钥之前使用KeyUp将不会触发事件,因此您可以按 ctrl ,然后按第二个键,这将触发一个事件。

答案 8 :(得分:0)

我花了一段时间才找到试图检测[Alt] [Right]时最终需要的提示。我在这里找到它:https://social.msdn.microsoft.com/Forums/vstudio/en-US/4355ab9a-9214-4fe1-87ea-b32dfc22946c/issue-with-alt-key-and-key-down-event?forum=wpf

在我使用的Shortcut帮助器类中,它可以归结为以下内容:

public Shortcut(KeyEventArgs e) : this(e.Key == System.Windows.Input.Key.System ? e.SystemKey : e.Key, Keyboard.Modifiers, false) { }

public Shortcut(Key key, ModifierKeys modifiers, bool createDisplayString)
{
    ...
} 

在“重新映射”原始值(注意e.Key == System.Windows.Input.Key.System ? e.SystemKey : e.Key部分)之后,可以照常进行进一步处理。

答案 9 :(得分:0)

if(例如e.Control && e.Shift && e.KeyCode == Keys.A) {

}

答案 10 :(得分:0)

KeyDown事件将仅保存有关最近按下的键的信息。我已经成功构建了一个字符串,其中包含所有串联在一起的最新键按下键。

如果单击了“ Control”键,或者字符串长度超过10个字符,我将清除该字符串。

每次检查字符串,然后执行后置后记任务,可以在您的应用程序中很好地利用秘密的热键功能。

    private void ConfigurationManager_KeyDown(object sender, KeyEventArgs e)
    {
        string currentKey = e.KeyCode.ToString().ToLower();

        if ((currentKey == "controlkey") || (hotKeyList.Length > 10))
        {
            hotKeyList = "";
        }
        else
        {
            hotKeyList += currentKey;
        }

        if ((hotKeyList == "int") && (!adminLogin))
        {
            hotKeyList = "";
            adminLogin = true;
            AdminLoginEvn();
        }
    }

对于我的热键上方的功能,将是“ Control(清除字符串)+ i + n + t”以触发AdminLoginEvn方法。合并了adminLogin布尔值,因此我只在打开应用程序时运行AdminLoginEvn一次。

答案 11 :(得分:-1)

您可以尝试我的工作代码:

private void listView1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.KeyCode == Keys.Up)
    {
        if(e.Alt==true){
            //do your stuff
        }
    }
}

我使用此代码,因为我不知道使用时的原因:

(e.Keycode == Keys>up && e.Alt==true)

没有工作。

答案 12 :(得分:-2)

你必须记住按下的键(即在bool数组中)。按下(keydown)时将位置设置为1,向上时设置为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