12

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

4

2 に答える 2

21

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

このプロパティが 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
于 2012-12-05T15:55:39.327 に答える
2

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

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
于 2012-12-05T16:01:25.553 に答える