質問

キーダウンイベントを使用して、押されたキーを検出し、さまざまな操作のためにいくつかのキーの組み合わせを持っています。

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つのキーの組み合わせはすべて、2番目の修飾子を追加するとすぐに機能しなくなります。

役に立ちましたか?

解決

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 を許可する場合は、ビット単位のORを使用します( 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で停止するはずですが、その背後にある特定のメカニズムはわかりません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top