web-dev-qa-db-ja.com

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
}

何らかの理由で、私がヒットしたキーの組み合わせ CtrlShiftC 動かない。私はそれらを再注文し、それがからの干渉である可能性があると考えて上部に配置しました CtrlC、さらには CtrlC 問題の原因かどうかを確認します。それでも動作しません。それはおそらく非常に単純なものであることは知っていますが、それが何であるかを完全に理解することはできません。 2番目の修飾子を追加するとすぐに、1つの修飾子と1つのキーの組み合わせのすべてが正常に機能します。

24
jsmith
if (e.KeyCode == Keys.C && e.Modifiers == (Keys.Control | Keys.Shift))
{
    //Do work
}
else if (e.KeyCode == Keys.V && e.Modifiers == Keys.Control)
{
    //Paste
}
42
Rom

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

7
Chris J

許可したい場合 Ctrl そして Shift 次に、ビット単位のORを使用します(KeysFlags 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)
}

これは失敗します Alt も押されています

6
JDunkerley

別の方法は、非表示のメニュー項目を追加し、 CtrlShiftC それにショートカットし、そこでイベントを処理します。

2
Druid
      if ((Keyboard.Modifiers & ModifierKeys.Shift | ModifierKeys.Control) > 0)
          Debugger.Launch();
2
Stephane Ehret

これは私がしたことです 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
1
Chris

これを試して。思い通りに動作するはずですが、少し簡単です。

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

他の誰もそれらに言及していないので、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はそれを止めるはずですが、その背後にある特定のメカニズムはわかりません。

0
Martin