web-dev-qa-db-ja.com

フォーム全体でのvb.netキーダウンイベント

いくつかのコントロールがあるフォームがあります。コントロールイベントに関係なく、キーダウンイベントで特定のサブを実行したいと思います。つまり、ユーザーがフォームの任意の場所でCtrl + Sを押すと、サブルーチンが実行されます。

10
Malik

フォームの KeyPreview プロパティをTrueに設定し、そこでキーダウンイベントを処理する必要があります

このプロパティがtrueに設定されている場合、フォームはすべてのKeyPress、KeyDown、およびKeyUpイベントを受け取ります。フォームのイベントハンドラーがキーストロークの処理を完了すると、キーストロークがフォーカスのあるコントロールに割り当てられます。 ..........フォームレベルでのみキーボードイベントを処理し、コントロールがキーボードイベントを受信できないようにするには、フォームのKeyPressイベントハンドラーのKeyPressEventArgs.Handledプロパティをtrueに設定します。

したがって、たとえば、Control + Sキーの組み合わせを処理するには、フォームKeyDownイベントのこのイベントハンドラーを記述できます。

Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) Handles MyBase.KeyDown
    If  e.Control AndAlso e.KeyCode = Keys.S then
        ' Call your sub method here  .....
        YourSubToCall()

        ' then prevent the key to reach the current control
        e.Handled = False 
    End If
End Sub
17
Steve

私は以前にこのコードをフォームで使用しましたが、かなりうまく機能しているようです。

Protected Overrides Function ProcessKeyPreview(ByRef m As System.Windows.Forms.Message) As Boolean
    If m.Msg = &H100 Then  'WM_KEYDOWN
        Dim key As Keys = m.WParam
        If key = Keys.S And My.Computer.Keyboard.CtrlKeyDown Then 
             'DO stuff
             Return True
        End If
    End If

    Return MyBase.ProcessKeyPreview(m)
 End Function
2
Kratz