Подтвердить что ты не робот

KeyDown: распознавание нескольких ключей

Как определить в KeyDown, что было нажато Ctrl Up.

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

не может работать, потому что ни одна из этих клавиш не будет нажата точно в ту же секунду. Вы всегда должны сначала Ctrl, а затем другой...

4b9b3361

Ответ 1

Вы можете проверить модификаторы KeyEventArgs так:

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

Ссылка MSDN

Ответ 3

В KeyEventArgs есть свойства Ctrl, Alt и Shift, которые показывают, нажаты ли эти кнопки.

Ответ 4

Вы можете попробовать использовать объект 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;
    }
}

Ответ 5

Вы можете использовать свойство 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
}

Ответ 6

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 учитываются и не имеют значения для порядка.

Ответ 7

Я проверил ниже код. оно работает...

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

Ответ 8

это будет работать точно. Будьте осторожны с обработкой события 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 перед клавишей Up, и, таким образом, произойдет событие, прежде чем вы сможете нажать другое, а также нажатие второй клавиши снова вызовет событие.

При использовании KeyUp не будет запускаться событие до тех пор, пока вы не отпустите клавишу, поэтому вы можете нажать ctrl и нажать вторую клавишу, которая вызовет одно событие.

Ответ 9

Мне потребовалось некоторое время, чтобы найти подсказку, в которой я в конечном итоге нуждался при попытке обнаружить [Alt] [Right]. Я нашел это здесь: https://social.msdn.microsoft.com/Forums/vstudio/en-US/4355ab9a-9214-4fe1-87ea-b32dfc22946c/issue-with-alt-key-and-key-down-event? форум = МОФ

Это сводится к чему-то вроде этого в классе Shortcut helper, который я использую:

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) дальнейшая обработка может продолжаться как обычно.

Ответ 10

вы можете попробовать мой рабочий код:

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)

не работает.

Ответ 11

вы должны помнить нажатые клавиши (то есть в массиве bool). и установите положение 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