Reputation: 7278
I am using a keydown event to detect keys pressed and have several key combinations for various operations.
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
}
For some reason the key combination in which I hit Ctrl + Shift + C is not working. I have re ordered them, and placed it at the top thinking it might be interference from the Ctrl + C, and even removed the Ctrl + C to see if it was causing a problem. It still does not work. I know it's probably something very simple, but can't quite grasp what it is. All of my 1 modifier + 1 key combination's work fine, as soon as I add a second modifier is when it no longer works.
Upvotes: 28
Views: 49566
Reputation: 476
Another approach more suitable if you have more cases, and easier to read is:
private void Form_KeyDown(object sender, KeyEventArgs e)
{
Action action = e.KeyData switch
{
(Keys.Control | Keys.Shift | Keys.C) => DoWork,
(Keys.Control | Keys.V) => Paste,
_ => null
};
action?.Invoke();
}
private void DoWork()
{ // do work }
private void Paste()
{ // paste }
Upvotes: 0
Reputation: 1
Seeing as no one else mentions them, i'm just going to leave the suggestion to use 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
}
This should only act on specific key combinations, though the order of the modifiers don't seem to matter, the first one is always the last pressed key.
And e.Handled = true should stop it, though i don't know the specific mechanics behind it.
Upvotes: 0
Reputation: 33
This is what I did for a Ctrl+Z Undo and Ctrl+Shift+Z Redo operation and it worked.
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
Upvotes: 1
Reputation: 350
if ((Keyboard.Modifiers & ModifierKeys.Shift | ModifierKeys.Control) > 0)
Debugger.Launch();
Upvotes: 3
Reputation: 6453
Another way would be to add an invisible menu item, assign the Ctrl + Shift + C shortcut to it, and handle the event there.
Upvotes: 2
Reputation: 12505
If you want to allow Ctrl and Shift then use the bitwise OR (as Keys
is a Flags
enum)
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)
}
This will fail if Alt is pressed as well
Upvotes: 6
Reputation: 112835
Try this. Should behave the way you want it to, and it's a little simpler.
if (e.Control)
{
if (e.Shift && e.KeyCode == Keys.C)
{
//Do work
}
else if (e.KeyCode == Keys.V)
{
//Paste
}
}
Upvotes: 0
Reputation: 4199
if (e.KeyCode == Keys.C && e.Modifiers == (Keys.Control | Keys.Shift))
{
//Do work
}
else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
//Paste
}
Upvotes: 49