DOBON.NET DOBON.NETプログラミング掲示板過去ログ

RadioButtonでの→キーダウンプロセスについて

分類:[.NET]

いつもお世話になっております。
りきです。

WindowsアプリでRadioButtonを継承したコントロールを作成しました。
やりたいことは、
WndProcをオーバーライドして、ラジオボタンで右キーが押されたときに処理を行わないようにしたいと思ってますが、WM_KEYDOWNでは条件式に入りません。
「Enter」キーは拾うことができるのですが
WM_KEYDOWNでは、「→」キーダウンが拾えないのでしょうか?

ソースを以下に記述します。

よろしくお願いします。

-----------------------------------

Private WM_KEYDOWN As Integer = &H100

Protected Overrides Sub WndProc(ByRef m As System.Windows.Forms.Message)

If m.Msg = WM_KEYDOWN Then

Dim key As Keys = CType(m.WParam.ToInt32(), Keys)
If key = Keys.Right Then

Return

End If

End If

MyBase.WndProc(m)

End Sub
■No6678に返信(りきさんの記事)
> WindowsアプリでRadioButtonを継承したコントロールを作成しました。
> やりたいことは、
> WndProcをオーバーライドして、ラジオボタンで右キーが押されたときに処理を行わないようにしたいと思ってますが、WM_KEYDOWNでは条件式に入りません。
> 「Enter」キーは拾うことができるのですが
> WM_KEYDOWNでは、「→」キーダウンが拾えないのでしょうか?

というより、ProcessDialogKeys()メソッドでやった方がいいのではないでしょうか?
■No6679に返信(java.lang.Nullpoさんの記事)
> ■No6678に返信(りきさんの記事)
> というより、ProcessDialogKeys()メソッドでやった方がいいのではないでしょうか?

早速の返信ありがとうございます。

つまり、以下のようなソースになるのでしょうか?

また、
せっかくなので、話をもどしますが
WndProcでは拾えないのでしょうか?

-----------------------------
Protected Overrides Function ProcessDialogKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean

If keyData = Keys.Right Then

Return True

End If

Return False

End Function
> というより、ProcessDialogKeys()メソッドでやった方がいいのではないでしょうか?

いいえ、ProcessDialogKeysでは方向キーはインターセプトすることは
できないと思います。一連のキー入力関連のprotectedメソッド
の中で一番最初に呼び出されるのはProcessCmdKeyです。
これは、Win32APIのDispatchMessageを実行する前に呼び出される
PreProcessMessage内から呼び出されます。
したがって、ProcessCmdKeyをオーバーライドすればできます。

>>WM_KEYDOWNでは、「→」キーダウンが拾えないのでしょうか?

そうです。しかしながら、WM_GETDLGCODEを使えば拾うことはできますし、
その場で制御を返してしまえば無視することもできます。
■No6681に返信(antさんの記事)
> いいえ、ProcessDialogKeysでは方向キーはインターセプトすることはできないと思います。

できないこともないはずですが...

# ProcessCmdKey()でやった方が良いですけども。
2004/10/14(Thu) 01:04:25 編集(投稿者)

> できないこともないはずですが...

IsInputKeyが方向キーに対してtrueを返してしまいますが、
何らかの裏技があるのでしょうか?
■No6683に返信(antさんの記事)
> 2004/10/14(Thu) 01:04:25 編集(投稿者)
> 
>>できないこともないはずですが...
> 
> IsInputKeyが方向キーに対してtrueを返してしまいますが、
> 何らかの裏技があるのでしょうか?

「裏技」というより、「横着」な方法なら...

    Protected Overrides Function ProcessDialogKey(ByVal uKeyData As Keys) As Boolean
        If uKeyData = Keys.Right Then
            uKeyData = Keys.None
        End If

        Return MyBase.ProcessDialogKey(uKeyData)
    End Function

またはFalseで返しておいて、KeyDown()イベントで e.Handled = True ということも一応は可能でした。

まあ、後手に回れば回るほど、今回に関しては無意味でしてantさんの方法が良いと思いますが...。
■No6684に返信(java.lang.Nullpoさんの記事)
> ■No6683に返信(antさんの記事)
>>2004/10/14(Thu) 01:04:25 編集(投稿者)
>>
> >>できないこともないはずですが...
>>
>>IsInputKeyが方向キーに対してtrueを返してしまいますが、
>>何らかの裏技があるのでしょうか?
>
> 「裏技」というより、「横着」な方法なら...
>
> Protected Overrides Function ProcessDialogKey(ByVal uKeyData As Keys) As Boolean
> If uKeyData = Keys.Right Then
> uKeyData = Keys.None
> End If
>
> Return MyBase.ProcessDialogKey(uKeyData)
> End Function
>
> またはFalseで返しておいて、KeyDown()イベントで e.Handled = True ということも一応は可能でした。
>
> まあ、後手に回れば回るほど、今回に関しては無意味でしてantさんの方法が良いと思いますが...。

java.lang.Nullpoさん
antさん

返信ありがとうございます。
実現することができました。

とても勉強になりました。
メッセージ系をいろいろと試してみたいと思います。

ありがとうございました
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板