C# KeyDown:识别多个关键点

C# KeyDown:识别多个关键点,c#,keydown,ctrl,C#,Keydown,Ctrl,如何在向下键中确定按下了CtrlUp private void listView1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Control && e.KeyCode == Keys.Up) { //do stuff } } 无法工作,因为两个键从未在同一秒钟内完全按下。你总是先按Ctrl键,然后按另一个键 你必须记住按下的键(如在布尔数组中)。按

如何在
向下键中确定按下了CtrlUp

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

无法工作,因为两个键从未在同一秒钟内完全按下。你总是先按Ctrl键,然后按另一个键

你必须记住按下的键(如在布尔数组中)。按下(向下键)时将位置设置为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

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

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

来自:


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

您可以使用ModifierKeys属性:

if (e.KeyCode == Keys.Up && (ModifierKeys & Keys.Control) == Keys.Control)
{
    // CTRL + UP was pressed
}
请注意,ModifierKeys值可以是多个值的组合,因此,如果要检测到无论SHIFT键或ALT键的状态如何,都按了CTRL键,则需要像上面的示例中那样执行逐位比较。如果要确保未按下其他修改器,则应检查是否相等:

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

您可以尝试使用
键盘
对象检测
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;
    }
}

这肯定会奏效。小心处理
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,您将在向上键之前按下ctrl键,因此事件将在您按下另一个键之前发生,同时按下第二个键将再次触发事件


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

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

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)
不起作用。

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和Ctrl都被考虑在内,对于顺序没有任何重要性。

我在下面的代码中进行了测试。它是有效的

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

我花了一段时间才找到在尝试检测[Alt][Right]时最终需要的提示。我在这里找到的:

它可以归结为我使用的
快捷方式
助手类中的类似内容:

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
部分)后,可以像往常一样继续进行进一步的处理。

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


}

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

如果单击了“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”,以触发我的AdminLoginVn方法。adminLogin布尔值已合并,因此我只在应用程序打开时运行AdminLoginVn一次

这在我的键盘上永远不会是真的-例如,如果我按下lshift键和Keys.Up,它e.Shift永远不会是真的,而e.Modifiers总是保持为无。知道为什么吗?看来箭头键在某种程度上很特别。这个问题给了我们一些启示:我发现只有e.Key,但没有e.KeyCode。也没有e.Modifier。@KMC令人困惑的是,有两个不同的
KeyEventArgs
。我假设您使用的是
Windows.UI.Core
事件中的
corewindown
中的一个。这个答案是关于一个不同的事件。谢谢你,这个工作很完美
if(e.Control&&e.KeyCode==Keys.A)
Over,表示数据在KeyData字段中。这里没有人提到过。这些答案不正确吗?很好地抓住了@jp2code
ModifierKeys
Control
上的一个属性(例如windows窗体),它将为您提供有关当前正在按下的修改器键的信息<键事件随附的code>KeyData
包含有关与键一起按下导致事件的修改器键的信息。回想起来,我想说的是,
ModifierKeys
与按钮单击或类似事件一起更有趣,在关键事件期间使用
KeyData
更准确。注意:这是WPF。@TaW-我们正在运行一个XBAP应用程序(在Internet Explorer中运行的WPF)。因此,在这种情况下,您仍然需要使用Set the key stroke as
Handled
,否则IE将拾取它。XBAP不是一个广泛使用的框架,但我想我应该让你知道我为什么要讨论如何处理浏览器:)-谢谢。在回答一篇旧文章时,如果你能为你的答案提供一些上下文而不仅仅是代码,那将是很有帮助的,因为这可能会使它对其他人更有用。
    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();
        }
    }