Ответ 1
Вы можете проверить модификаторы KeyEventArgs так:
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Up && e.Modifiers == Keys.Control)
{
//do stuff
}
}
Как определить в KeyDown
, что было нажато Ctrl Up.
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Control && e.KeyCode == Keys.Up)
{
//do stuff
}
}
не может работать, потому что ни одна из этих клавиш не будет нажата точно в ту же секунду. Вы всегда должны сначала Ctrl, а затем другой...
Вы можете проверить модификаторы KeyEventArgs так:
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Up && e.Modifiers == Keys.Control)
{
//do stuff
}
}
Со страницы MSDN на KeyEventArgs:
if (e.KeyCode == Keys.F1 && (e.Alt || e.Control || e.Shift))
{
//Do stuff...
}
В KeyEventArgs
есть свойства Ctrl, Alt и Shift, которые показывают, нажаты ли эти кнопки.
Вы можете попробовать использовать объект 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;
}
}
Вы можете использовать свойство 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
}
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 учитываются и не имеют значения для порядка.
Я проверил ниже код. оно работает...
private void listView1_KeyDown(object sender, KeyEventArgs e)
{
if ((int) e.KeyData == (int) Keys.Control + (int) Keys.Up)
{
MessageBox.Show("Ctrl + Up pressed...");
}
}
это будет работать точно. Будьте осторожны с обработкой события 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 и нажать вторую клавишу, которая вызовет одно событие.
Мне потребовалось некоторое время, чтобы найти подсказку, в которой я в конечном итоге нуждался при попытке обнаружить [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
) дальнейшая обработка может продолжаться как обычно.
вы можете попробовать мой рабочий код:
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)
не работает.
вы должны помнить нажатые клавиши (то есть в массиве 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