C#で複数の修飾キーを使用する方法
-
07-07-2019 - |
質問
キーダウンイベントを使用して、押されたキーを検出し、さまざまな操作のためにいくつかのキーの組み合わせを持っています。
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で停止するはずですが、その背後にある特定のメカニズムはわかりません。