VB2005 WINDOWS XP
お世話になっております。
特に困ったというわけではないのですが不思議で気になるので誰かご存知の方いらっしゃったら教えてください。
KeyUpとKeyDownはそのイベントの発生タイミングが異なるだけで同じだと思っていたのですが、以下のような現象にでくわしています。
If e.KeyCode = Keys.Return Then
MsgBox("認識!")
End If
以上のようなコードを書くとKeyUpでは認識するのにKeyDownでは認識しないんです。
ちなみに他のキー(Delete,BackSpace)などでは両方とも認識できるんですよね。
VB6.0では両方とも認識できていたのに何故なんでしょう??
作っているものはゲームなどではないので、特にキーを押したときでも離したときでも変わりはないのでどっちでもいいのですが・・・。
どなたかよろしければご教授お願いいたします♪
そりゃぁ、メッセージボックス表示してるんだもの。
…といえばいいのかな?
???メッセージボックス表示だと何か不都合があるのですか??
メッセージボックスじゃなくても
debug.Print
でも同じ結果が得られるんですよ〜(>_<)
ステップインでも引っかからないんですけど・・・。
これってもしかして使用しているキーボードの問題なんじゃ!?と思い始めているのですがどうでしょうか?
>???メッセージボックス表示だと何か不都合があるのですか??
フォームがアクティブで無くなるのでうまくイベントが起こらない可能性があります。
こういったイベントの確認はメッセージボックスは使いません。
>debug.Print
>でも同じ結果が得られるんですよ〜(>_<)
[VB.NET]になって Debug.WriteLine になったんですが…2005 では復活したの
でしょうか?
>ステップインでも引っかからないんですけど・・・
ブレークポイントで止めてもフォームがアクティブで無くなるので、後から起こる
イベントが起こらない可能性があります。
[VB.NET2003]でテキストボックスで確認しました。
リターンキーで問題なく確認できました。
Private Sub TextBox1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyUp
If e.KeyCode = Keys.Return Then
Debug.WriteLine("KeyUp_Return")
End If
End Sub
Private Sub TextBox1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyDown
If e.KeyCode = Keys.Return Then
Debug.WriteLine("KeyDown_Return")
End If
End Sub
やっぱり情報が小出しにはなってますね。そんなに気分を害してる
わけではないですが、どのコントロールで確認しました?全ての
コントロールで試しました?
…失礼ですが、メッセージボックスやブレークポイントでイベントを
確認してる時点でそんなに経験豊富では無いように見受けます。
自分がやったことや考えたことは、詳しく書くことを心掛けたほうが、
2度手間にならなくていいですよ?
>> 以上のようなコードを書くとKeyUpでは認識するのにKeyDownでは認識しないんです。
フォーカスがボタンなどの上にあった…とか?
> [VB.NET]になって Debug.WriteLine になったんですが…2005 では復活したの
> でしょうか?
隊長殿。…失礼ですが、質問なさる前に御自身で確認すればよろしいのでは?
http://msdn2.microsoft.com/ja-jp/library/system.diagnostics.debug.print%28VS.80%29.aspx
>…失礼ですが、メッセージボックスやブレークポイントでイベントを
>確認してる時点でそんなに経験豊富では無いように見受けます。
そうですね。全くの専門外です。
趣味でやっているとかならいいんでしょうが、仕事として割り振られているので途方にくれています。
>自分がやったことや考えたことは、詳しく書くことを心掛けたほうが、
>2度手間にならなくていいですよ?
私はお聞きしている立場なので、別に何度手間になってもいいんですが、回答者に何度も手間取らせて申し訳ないです。
情報が不足しているという認識すらありませんでした・・・。
フォーカスがボタンの上というオチも考えたんですが、何度やってもフォームにフォーカスがある状態で同様の症状が再現するんで、多分違います。
対象としたコントロールはフォームだけで他のコントロールでは確認できていません。確かにTextBoxだとうまくいきますね。
おそらくMessageBoxがアクティブになるとイベントが起こらないのですかね?
でも、KeyUp →MsgBoxの順なんでしっくり来ない気もしますが・・・。
特攻隊長まるるうさん、Dentalさん、貴重な書き込みありがとうございます。
フォームにフォーカスというのがまた微妙ですが……。
コントロールによって、そのコントロール自身が扱うべきはない一部のキーについてはその入力を無視するような動作を行います(具体的には ProcessDialogKey メソッドが false を返します)。
例えば、大抵のコントロールにおいて TAB キーがそうなります。TAB は自分自身だけでは処理できませんからね(親コントロールに伝えてフォーカスを動かしてもらう必要がある)。
これによって KeyDown は発生しなくなりますが、このメソッドへの問い合わせはキーが押されたときのみ行われ、放されたときは確認しません。これは特殊キー時の処理はキーが押されたときに全て行い、放されたときは考慮する必要がないという考えからなのでしょう。
// 例えば TAB キーなら、TAB を放すときにはすでに他のコントロールにフォーカスが移っていて、上げるときにどうこうすることはありません。
Hongliang さんが解説されているので、屋下に屋を架すようになりますが…
キー入力のプリプロセスに関して、下記のサイトが参考になるかもしれません。
http://www.atmarkit.co.jp/fdotnet/dotnettips/241windlgkey/windlgkey.html
> 何度やってもフォームにフォーカスがある状態で同様の症状が再現するんで、多分違います。
『フォームにフォーカスがある状態』との事なので、コントロールが
一つも無い状態でテストしてみましたが…Up/Down とも反応しましたよ。
手元に開発環境が無かったので、メモ帳 + コマンドラインでの
コンパイルですが、Visual Studio 開発環境で組んだ場合でも、
同じ結果になるかと思います。
'
' .NET 1.1 の場合のコンパイル
' vbc.exe /t:exe /r:System.dll,System.Windows.Forms.dll /out:c:\2003.exe C:\test.vb
'
' .NET 2.0 の場合のコンパイル
' vbc.exe /t:exe /out:c:\2005.exe C:\test.vb
'
Imports System
Imports System.Windows.Forms
Class F
Inherits Form
Shared Sub Main()
Dim F1 As New F()
F1.KeyPreview = True
Application.Run(F1)
End Sub
Sub OnUp(ByVal sender As Object, ByVal e As KeyEventArgs) Handles MyBase.KeyUp
If e.KeyCode = Keys.Return Then
Console.WriteLine("Up")
End If
End Sub
Sub OnDown(ByVal sender As Object, ByVal e As KeyEventArgs) Handles MyBase.KeyDown
If e.KeyCode = Keys.Return Then
Console.WriteLine("Down")
End If
End Sub
End Class
・・・実はまだ職場で煮詰まっております(笑)
あ、本件に関してははじめに書かせていただいたとおり、あくまで私の勉強のためにお聞きしているだけなので、別段、KeyDownで処理してしまっているので困りはしないのですが・・・。
なるほど、キープリプロセスですか。魔界の仮面弁士さんのリンク先を読ませてもらいました。また、失礼かとは思いますが、そのままソースをコピペしてコンパイルしてみると、やはり症状が再現します。
もうこうなるとハードウエアの問題としか考えられなくなります。
明日、違うキーボードで試してみようかと思っております。
Hongliangさん、魔界の仮面弁士さんありがとうございました。
ちなみに、どうでもいいことですが、魔界の仮面弁士さんには違う掲示板で数年前相当お世話になっていたものです(笑)
もちろん当時とは私のHNも違いますのでご存知ではないでしょうけど。
今後も機会がありましたらぜひ、ご教授のほどよろしくお願いいたします。
ツイート | ![]() |