Ответ 1
if (e.KeyCode == Keys.C && e.Modifiers == (Keys.Control | Keys.Shift))
{
//Do work
}
else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
//Paste
}
Я использую событие keydown для обнаружения нажатых клавиш и нескольких комбинаций клавиш для различных операций.
if (e.KeyCode == Keys.C && e.Modifiers == Keys.Control && e.Modifiers == Keys.Shift)
{
//Do work
}
else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
//Paste
}
По какой-то причине комбинация клавиш, в которой я попал Ctrl + Shift + C, не работает. Я заказал их, и поместил его наверху, думая, что это может быть помеха от Ctrl + C, и даже удалил Ctrl + C, чтобы увидеть, вызвала ли она проблему. Это все еще не работает. Я знаю, это, вероятно, что-то очень простое, но не может понять, что это такое. Все мои 1 модификатор + 1 комбинация клавиш работают нормально, как только я добавляю второй модификатор, когда он больше не работает.
if (e.KeyCode == Keys.C && e.Modifiers == (Keys.Control | Keys.Shift))
{
//Do work
}
else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
//Paste
}
Вы пробовали e.Modifiers == (Keys.Control | Keys.Shift)
?
Если вы хотите разрешить Ctrl и Shift, то используйте побитовое ИЛИ (в качестве Keys
это Flags
перечисление)
if (e.KeyCode == Keys.C && e.Modifiers == (Keys.Control | Keys.Shift))
{
//Do work (if Ctrl-Shift-C is pressed, but not if Alt is pressed as well)
}
else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
//Paste (if Ctrl is only modifier pressed)
}
Это не удастся, если Alt также нажата
Другим способом было бы добавить невидимый элемент меню, назначить ему Ctrl + Shift + C ярлык и обработать там событие.
if ((Keyboard.Modifiers & ModifierKeys.Shift | ModifierKeys.Control) > 0)
Debugger.Launch();
Это то, что я сделал для операции Ctrl + Z Отменить и Ctrl + Shift + Z Повторить, и это сработало.
Private Sub Form_Main_KeyDown(sender As Object, e As KeyEventArgs) Handles Me.KeyDown
Select Case e.KeyCode
Case Keys.Add
diagramView.ZoomIn()
Case Keys.Subtract
diagramView.ZoomOut()
Case Keys.Z
If e.Modifiers = Keys.Control + Keys.Shift Then
diagram.UndoManager.Redo()
ElseIf e.Modifiers = Keys.Control Then
diagram.UndoManager.Undo()
End If
End Select
End Sub
Попробуйте это. Должен вести себя так, как вы хотите, и это немного проще.
if (e.Control)
{
if (e.Shift && e.KeyCode == Keys.C)
{
//Do work
}
else if (e.KeyCode == Keys.V)
{
//Paste
}
}
Увидев, как никто другой не упоминает их, я просто собираюсь оставить предложение использовать KeyEventArgs.KeyData:
if (e.KeyData == (Keys.C | Keys.Control | Keys.Shift)
{
//do stuff
//potentially use e.Handled = true
}
if (e.KeyData == (Keys.V | Keys.Control)
{
//do other stuff
//potentially use e.Handled = true
}
Это должно действовать только на определенные комбинации клавиш, хотя порядок модификаторов, похоже, не имеет значения, первый из которых всегда является последней нажатой клавишей.
И e.Handled = true должен остановить его, хотя я не знаю, какая именно механика стоит за ним.