2009-09-16 6 views
19

私はkeydownイベントを使用して、押されたキーを検出し、さまざまな操作のためのいくつかのキーの組み合わせを持っています。私は + Cが動作していないはCtrl +Shiftキーを打つキーの組み合わせれるいくつかの理由でC#で複数の修飾キーを使用する方法

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キー + Cからの干渉も、さらにはそれが問題を引き起こしていたかどうかを確認するためにCtrlキー + Cを削除可能性が考えて一番上にそれを置いてきました。それでも動作しません。私はそれがおそらく非常に単純なものだと知っていますが、それが何であるかをかなり理解することはできません。すべての私の1つの修飾子+ 1つのキーの組み合わせの作業は、すぐに私は2番目の修飾子を追加すると、もはや動作します。

答えて

39
if (e.KeyCode == Keys.C && e.Modifiers == (Keys.Control | Keys.Shift)) 
{ 
    //Do work 
} 
else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control) 
{ 
    //Paste 
} 
7

e.Modifiers == (Keys.Control | Keys.Shift)を試しましたか?

0

これを試してください。あなたが望むように行動しなければならず、それは少し簡単です。

if (e.Control) 
{ 
    if (e.Shift && e.KeyCode == Keys.C) 
    { 
     //Do work 
    } 
    else if (e.KeyCode == Keys.V) 
    { 
     //Paste 
    } 
} 
6

あなたは(KeysFlags列挙型であるとして)ビットごとのORを使用し、その後Ctrlキーシフトを許可する場合は

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キーも同様に押された場合、これが失敗します

2

もう1つの方法は、目に見えないメニュー項目を追加することです。Ctrl + Shift + Cここにイベントを処理してください。

1

これは私がCtrlキー+Z元に戻すとはCtrl +Shiftキー + Zやり直し操作のために行なったし、それが働いたものです。

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 
} 

これが唯一しかし、特定のキーの組み合わせに基づいて行動する必要があります誰もがそれらを言及しないように、私はちょうどKeyEventArgs.KeyDataを使用するように提案を残すつもりです見て

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 
2
 if ((Keyboard.Modifiers & ModifierKeys.Shift | ModifierKeys.Control) > 0) 
      Debugger.Launch(); 
0

修飾子の順序は重要ではないようですが、最初のキーは常に最後に押されたキーです。

e.Handled = trueはそれを停止するはずですが、その背後にある具体的な仕組みはわかりません。

関連する問題