39

我怎样才能确定在KeyDown那个CtrlUp被按下了。

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

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

4

13 回答 13

31

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

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

MSDN 参考

于 2009-08-12T11:44:02.503 回答
13

KeyEventArgs 上的 MSDN 页面

if (e.KeyCode == Keys.F1 && (e.Alt || e.Control || e.Shift))
{
    //Do stuff...
}
于 2009-08-12T11:44:14.330 回答
7

您可以尝试使用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;
    }
}
于 2011-12-20T21:09:04.813 回答
7

在里面KeyEventArgs有属性Ctrl,显示这些按钮是否被按下。AltShift

于 2009-08-12T11:45:01.490 回答
3
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 都被考虑在内,并且顺序无关紧要。

于 2017-11-28T02:41:25.427 回答
2

您可以使用 ModifierKeys 属性:

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

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

if (e.KeyCode == Keys.Up && ModifierKeys == Keys.Control)
{
    // CTRL + UP was pressed
}
于 2009-08-12T11:45:10.583 回答
0

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

}

于 2019-11-25T07:28:22.393 回答
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 ?论坛=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部分)之后,可以像往常一样继续进行进一步的处理。

于 2019-05-12T22:41:40.890 回答
0

我测试了下面的代码。有用...

private void listView1_KeyDown(object sender, KeyEventArgs e)
    {
        if ((int) e.KeyData == (int) Keys.Control + (int) Keys.Up)
        {
            MessageBox.Show("Ctrl + Up pressed...");
        }
    }
于 2019-01-29T08:30:50.550 回答
0

这肯定会奏效。小心处理KeyUpevent 而不是keyDown.

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

对我来说,keyDown没有用,keyUp 代替了相同的代码。

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

使用KeyUp中直到松开按键才会触发事件,所以可以按ctrl,再按第二个键,会触发一个事件。

于 2016-01-02T17:51:50.993 回答
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();
        }
    }

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

于 2020-06-15T19:56:52.630 回答
-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)

没用。

于 2017-01-12T10:14:08.140 回答
-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
于 2009-08-12T11:43:16.390 回答