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

TextBox等「矢印キー」でイベント認識する方法を知りたいのですが

環境/言語:[環境(Windows 2000) 使用言語 (VB.NET)]
分類:[.NET]

恐れ入ります。

TextBox、チェックボックス等「矢印キー」でイベント認識する方法を知りたいのですが
現在「Enterキー」等認識してくれるのですが、「矢印キー」は認識してくれません。
何か方法があるのでしょうか?
ご存知の方是非教えて下さい
宜しくお願い致します。m(_ _)m
参考にならないかもしれませんが、Form.KeyPreviewを使用して
フォームで押されたキーを取得できるようにすれば
Form.KeyDownで値をとることができます。

サンプルコードはWindowsフォームにテキストボックスコントロールを
ひとつだけ貼り付けてから以下のコードを貼り付けて
[F5]キーなどで実行してください。
38とか40とかのキーコードが帰ってきます。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.KeyPreview = True
End Sub

Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
If Me.ActiveControl.Name = "TextBox1" Then
Me.Text = "テキストボックスで" + (e.KeyValue.ToString) + "を押した"
End If
End Sub

■No7381に返信(こうさんの記事)
> 恐れ入ります。
>
> TextBox、チェックボックス等「矢印キー」でイベント認識する方法を知りたいのですが
> 現在「Enterキー」等認識してくれるのですが、「矢印キー」は認識してくれません。
> 何か方法があるのでしょうか?
> ご存知の方是非教えて下さい
> 宜しくお願い致します。m(_ _)m
■No7381に返信(こうさんの記事)
> TextBox、チェックボックス等「矢印キー」でイベント認識する方法を知りたいのですが

TextBoxを継承したクラスを作って、IsInputKeyをオーバーライドすれば
KeyDownイベントとか起るみたいです
例えば、左矢印の場合
Public Class mytext
Inherits TextBox
Protected Overrides Function IsInputKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean
If keyData = Keys.Left Then
Return True
Else
Return MyBase.IsInputKey(keyData)
End If
End Function
End Class
> ■No7381に返信(こうさんの記事)

こうさん こんにちは
皆さんが書き込まれているように矢印キーは KeyDown、KeyUp イベントで
起こります。
たとえば次のコードはフォームにテキストボックスを貼り付けた
場合のTextBox1_KeyDownイベントのコードです

Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
TextBox1.Text = e.KeyCode.ToString
e.Handled = True
End Sub

もしイベントが発生しないのであれば、他に原因があると思われます。
フォームにテキストボックスだけの簡単な環境でテストすることを
お勧めします。
■No7381に返信(こうさんの記事)
> 現在「Enterキー」等認識してくれるのですが、「矢印キー」は認識してくれません。
> 何か方法があるのでしょうか?

何も気にすることなくできるはずです。
親切にサンプルコードを書くとこうなります。

Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As KeyEventArgs) Handles TextBox1.KeyDown
    Select Case e.KeyCode
        Case Keys.Up
            MessageBox.Show("[↑]キーを押下")
        Case Keys.Left
            MessageBox.Show("[←]キーを押下")
        Case Keys.Down
            MessageBox.Show("[↓]キーを押下")
        Case Keys.Right
            MessageBox.Show("[→]キーを押下")
    End Select
End Sub

無数にあるのでしたら、Mooさんの仰るとおり、Form側で制御した方が素直です。

# しかし、矢印キーをキャッチして何に利用するのでしょう?
# もし、フォーカス制御などでしたら、私は反対しますが。


■No7407に返信(DEGさんの記事)
> TextBoxを継承したクラスを作って、IsInputKeyをオーバーライドすれば
> KeyDownイベントとか起るみたいです

今回は、そのようなことをする必要は一切ないと思われます。


■No7411に返信(平ちゃんさんの記事)
> Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
>     TextBox1.Text = e.KeyCode.ToString
>     e.Handled = True
> End Sub

蛇足になりますが、KeyDownイベントで、「e.Handled = True」としても、
生のキーのイベントはキャンセルできません。
実際、[A]を入力すると「aA」などになります。

# 今回、そういうつもりでキャンセルにしてるわけではないのなら話は別ですが。
■No7412に返信(java.lang.Nullpoさんの記事)
>
> ■No7411に返信(平ちゃんさんの記事)
>>Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
>> TextBox1.Text = e.KeyCode.ToString
>> e.Handled = True
>>End Sub
>
> 蛇足になりますが、KeyDownイベントで、「e.Handled = True」としても、
> 生のキーのイベントはキャンセルできません。
> 実際、[A]を入力すると「aA」などになります。
>
> # 今回、そういうつもりでキャンセルにしてるわけではないのなら話は別ですが。

失礼しました。
KeyDown、KeyPress,KeyUp の3つのイベントに同じコードを書いて
夫々の違いテストして頂こうかと思ったのですが、書いている途中で
「失礼かな」と思い、KeyDownのみ残してしまいました。
仰るとおり無意味なコードでした。
ごめんなさい。
■No7412に返信(java.lang.Nullpoさんの記事)
> ■No7407に返信(DEGさんの記事)
>>TextBoxを継承したクラスを作って、IsInputKeyをオーバーライドすれば
>>KeyDownイベントとか起るみたいです
>
> 今回は、そのようなことをする必要は一切ないと思われます。

最近使った、UserControlで、矢印キーを認識してくれなかったので
同じかと思いましたが、
TextBoxでは、何もしなくても認識してくれたみたいで、
失礼しました。
色々ご相談に乗っていただき有難う御座いました。m(_ _)m

オーバーライドする事によって認識するようになりました。

有難う御座いました。
解決済み!

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