web-dev-qa-db-ja.com

VB.NETで「Ctrl + T」などの同時キープレスをどのように検出しますか?

VB.NETで「Control」キーと「t」キーが同時に押されていることを検出しようとしています。これまでのコードは次のとおりです。

Private Sub frmTimingP2P_KeyDown(sender As Object, e As System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown
    If e.KeyValue = Keys.ControlKey And e.KeyValue = Keys.T Then
        MessageBox.Show("Ctrl + T")
    End If
End Sub

Andステートメントと2番目のkeyvalueステートメントを削除することで、どちらかのキーを検出できますが、これを試しても実際には何も得られません。別の方法はありますか?

ありがとう

11
J2Tuner

まず、コード内のAndは論理演算子なので、AndAlsoにする必要があります。 And in VBはビット演算子です。次に、 Modifiers property を使用して修飾キーをテストできます:

If (e.KeyCode And Not Keys.Modifiers) = Keys.T AndAlso e.Modifiers = Keys.Ctrl Then
    MessageBox.Show("Ctrl + T")
End If

e.KeyCode And Not Keys.Modifiers修飾キーをマスクするには、条件の最初の部分で必要です。

If e.Modifiers = Keys.CtrlIf e.Control

または、これらの2つのクエリを照合することができます。 Ctrl+T 押されました:

If e.KeyCode = (Keys.T Or Keys.Ctrl) Then …

どちらのスニペットでも ビットマスク を使用しています。

10
Konrad Rudolph

Private Sub frmMain_Zaporka_KeyDown(sender As Object、e As KeyEventArgs)Handles MyBase.KeyDown

Select Case e.KeyData
    Case (Keys.Control + Keys.Shift + Keys.F12)
        MsgBox("Control + Shift + F12")
    Case (Keys.Escape)
        Me.Close()
End Select

' or

If e.KeyCode = Keys.F12 AndAlso e.Modifiers = (Keys.Control Or Keys.Shift) Then
    MsgBox("Control + Shift + F12")
ElseIf e.KeyCode = Keys.Escape Then
    Me.Close()
End If

' or

Select Case e.KeyCode
    Case (Keys.F12 And e.Control And e.Shift)
        MsgBox("Control + Shift + F12")
    Case (Keys.Escape)
        Me.Close()
End Select

End Sub

4
Kuromuro

同じ問題がありましたが、これを機能させるには、フォームKeyPreviewプロパティをtrueに設定する必要がありました。 Visual Studioでは、これを[フォーム[デザイン]プロパティ]ウィンドウで変更するか、ロード時にプロパティを変更できます。

Private Sub frmTimingP2P_Load(ByVal sender As System.Object, ByVal e As _ 
                               System.EventArgs) Handles MyBase.Load

    Me.KeyPreview = True

End Sub

次に、以下を使用して使用します。

Private Sub frmTimingP2P_KeyDown(ByVal Sender As Object, ByVal e As _ 
                        System.Windows.Forms.KeyEventArgs) Handles Me.KeyDown


        If (e.KeyCode = Keys.T AndAlso e.Modifiers = Keys.Control) Then
            MessageBox.Show("Ctrl + T")
        End If

End Sub

または上記の回答で提供される他のプログラムロジック.

2
user2348797

現在vb.netをインストールしていませんが、keydownまたはkeypressイベントでこれを試してください:

If e.KeyCode = Keys.T AndAlso e.Control = True Then
MsgBox("Ctrl + T")
End If
1
Ruben_PH

長いコードからあなたを救います。ここに:

If e.Control And e.Alt And e.KeyCode = Keys.G Then
    MsgBox("Control Alt G")
End If
1
Gerard Balaoro