KeyUpとKeyDownの違いについて


かものねぎ  2006-05-20 00:45:27  No: 131494

VB2005  WINDOWS  XP

お世話になっております。
特に困ったというわけではないのですが不思議で気になるので誰かご存知の方いらっしゃったら教えてください。

KeyUpとKeyDownはそのイベントの発生タイミングが異なるだけで同じだと思っていたのですが、以下のような現象にでくわしています。

If e.KeyCode = Keys.Return Then
            MsgBox("認識!")
End If

以上のようなコードを書くとKeyUpでは認識するのにKeyDownでは認識しないんです。
ちなみに他のキー(Delete,BackSpace)などでは両方とも認識できるんですよね。
VB6.0では両方とも認識できていたのに何故なんでしょう??

作っているものはゲームなどではないので、特にキーを押したときでも離したときでも変わりはないのでどっちでもいいのですが・・・。

どなたかよろしければご教授お願いいたします♪


ガッ  2006-05-20 03:49:45  No: 131495

そりゃぁ、メッセージボックス表示してるんだもの。
…といえばいいのかな?


かものねぎ  2006-05-20 04:08:21  No: 131496

???メッセージボックス表示だと何か不都合があるのですか??

メッセージボックスじゃなくても
debug.Print
でも同じ結果が得られるんですよ〜(>_<)

ステップインでも引っかからないんですけど・・・。
これってもしかして使用しているキーボードの問題なんじゃ!?と思い始めているのですがどうでしょうか?


特攻隊長まるるう  2006-05-20 04:29:43  No: 131497

>???メッセージボックス表示だと何か不都合があるのですか??
フォームがアクティブで無くなるのでうまくイベントが起こらない可能性があります。
こういったイベントの確認はメッセージボックスは使いません。

>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度手間にならなくていいですよ?


Dental  2006-05-20 05:12:43  No: 131498

>> 以上のようなコードを書くとKeyUpでは認識するのにKeyDownでは認識しないんです。
フォーカスがボタンなどの上にあった…とか?

> [VB.NET]になって Debug.WriteLine になったんですが…2005 では復活したの
> でしょうか?
隊長殿。…失礼ですが、質問なさる前に御自身で確認すればよろしいのでは?
http://msdn2.microsoft.com/ja-jp/library/system.diagnostics.debug.print%28VS.80%29.aspx


かものねぎ  2006-05-20 05:49:06  No: 131499

>…失礼ですが、メッセージボックスやブレークポイントでイベントを
>確認してる時点でそんなに経験豊富では無いように見受けます。

そうですね。全くの専門外です。
趣味でやっているとかならいいんでしょうが、仕事として割り振られているので途方にくれています。

>自分がやったことや考えたことは、詳しく書くことを心掛けたほうが、
>2度手間にならなくていいですよ?

私はお聞きしている立場なので、別に何度手間になってもいいんですが、回答者に何度も手間取らせて申し訳ないです。
情報が不足しているという認識すらありませんでした・・・。

フォーカスがボタンの上というオチも考えたんですが、何度やってもフォームにフォーカスがある状態で同様の症状が再現するんで、多分違います。

対象としたコントロールはフォームだけで他のコントロールでは確認できていません。確かにTextBoxだとうまくいきますね。

おそらくMessageBoxがアクティブになるとイベントが起こらないのですかね?
でも、KeyUp  →MsgBoxの順なんでしっくり来ない気もしますが・・・。

特攻隊長まるるうさん、Dentalさん、貴重な書き込みありがとうございます。


Hongliang  URL  2006-05-20 06:12:41  No: 131500

フォームにフォーカスというのがまた微妙ですが……。

コントロールによって、そのコントロール自身が扱うべきはない一部のキーについてはその入力を無視するような動作を行います(具体的には ProcessDialogKey メソッドが false を返します)。
例えば、大抵のコントロールにおいて TAB キーがそうなります。TAB は自分自身だけでは処理できませんからね(親コントロールに伝えてフォーカスを動かしてもらう必要がある)。
これによって KeyDown は発生しなくなりますが、このメソッドへの問い合わせはキーが押されたときのみ行われ、放されたときは確認しません。これは特殊キー時の処理はキーが押されたときに全て行い、放されたときは考慮する必要がないという考えからなのでしょう。
// 例えば TAB キーなら、TAB を放すときにはすでに他のコントロールにフォーカスが移っていて、上げるときにどうこうすることはありません。


魔界の仮面弁士  2006-05-20 08:07:01  No: 131501

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


かものねぎ  2006-05-20 09:12:03  No: 131502

・・・実はまだ職場で煮詰まっております(笑)
あ、本件に関してははじめに書かせていただいたとおり、あくまで私の勉強のためにお聞きしているだけなので、別段、KeyDownで処理してしまっているので困りはしないのですが・・・。

なるほど、キープリプロセスですか。魔界の仮面弁士さんのリンク先を読ませてもらいました。また、失礼かとは思いますが、そのままソースをコピペしてコンパイルしてみると、やはり症状が再現します。
もうこうなるとハードウエアの問題としか考えられなくなります。
明日、違うキーボードで試してみようかと思っております。

Hongliangさん、魔界の仮面弁士さんありがとうございました。
ちなみに、どうでもいいことですが、魔界の仮面弁士さんには違う掲示板で数年前相当お世話になっていたものです(笑)
もちろん当時とは私のHNも違いますのでご存知ではないでしょうけど。
今後も機会がありましたらぜひ、ご教授のほどよろしくお願いいたします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加