0

次のコードは機能し、ユーザーがキーボードの a キーを押すと Label1 に出力されます。

Public Class Form1

Sub New()

    InitializeComponent()

End Sub

Public Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal HWND As IntPtr, ByVal WMSG As Integer, ByVal WPARAM As Integer, ByVal LPARAM As IntPtr) As IntPtr

Private WM_KEYDOWN As Integer = &H100

Protected Overrides Sub WndProc(ByRef WindowsMessage As Message)

    Select Case WindowsMessage.Msg

        Case WM_KEYDOWN

            Dim VirtualKeyCode As Integer = CType(WindowsMessage.WParam, Integer)

            Select Case (VirtualKeyCode)

                Case Keys.A
                    Label1.Text = "The a key was pressed"

            End Select

    End Select

    MyBase.WndProc(WindowsMessage)

End Sub

クラス終了

フォームにボタンを追加 (ドラッグ) すると、コードが機能しなくなります。ボタンがフォーム上にあると、WM_KEYDOWN メッセージは送信されなくなりました。Case WM_KEYDOWN で設定されたブレークポイントはヒットしません。

ボタンを削除すると、コードが再び機能し始めます。

助言がありますか?

ありがとう。

4

1 に答える 1

0

キーボード メッセージは、フォーカスのあるウィンドウに投稿されます。フォームに子コントロールがない限り、アクティブ化されたときにフォームにフォーカスが移ります。フォーカスを取得するのはあまり得意ではありませんが、たとえば、フォーカスを持っていることを示す方法はなく、それ自体はキーストロークを使用しません。

フォーカスを取得するの好きなコントロールをフォームに配置するとすぐに、それが変わります。ボタンのように。そのコントロールは常にフォーカスを取得し、フォームに戻すことはできません。したがって、フォームは WM_KEYDOWN メッセージの受信を停止し、代わりにボタンに移動します。

フォームをキーストロークに応答させる方法があります。ショートカット キーの場合は重要です。F1 と同様に、どのコントロールにフォーカスがあるかに関係なく、ヘルプを表示する必要があります。Winforms には組み込みのサポートがあり、ProcessCmdKey() メソッドをオーバーライドできます。このような:

Protected Overrides Function ProcessCmdKey(ByRef msg As Message, ByVal keyData As Keys) As Boolean
    If keyData = Keys.Control Or Keys.A Then
        MessageBox.Show("yada")
        Return True
    End If
    Return MyBase.ProcessCmdKey(msg, keyData)
End Function

これをフォームのコードに貼り付け、Ctrl+A を押してテストします。

于 2013-02-01T01:46:27.550 に答える