いくつかのコントロールがあるフォームがあります。コントロールイベントに関係なく、キーダウンイベントで特定のサブを実行したいと思います。つまり、ユーザーがフォームの任意の場所でCtrl + Sを押すと、サブルーチンが実行されます。
フォームの 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
私は以前にこのコードをフォームで使用しましたが、かなりうまく機能しているようです。
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