プロが教えるわが家の防犯対策術!

現在WindowsXP上でVB2005で開発を行っています。
タイトルの通りなのですがPreviewKeyDownイベントが2回発生してしまって困っています。簡易なコードを下記に記します。

Private Sub WebBrowser1_PreviewKeyDown(ByVal sender As Object,ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs)Handles WebBrowser1.PreviewKeyDown

My.Computer.Audio.Play(" My.Computer.Audio.Play("C:\WINDOWS\Media\Windows XP Shutdown.wav", AudioPlayMode.WaitToComplete)

End Sub

というコードを書いたところ、WEBブラウザ上で何かキーを押すと2回、waveファイルが再生されてしまいます。違うwaveファイルでも試しましたが同じでした。ですのでファイルの長さ等は関係ないようです。
原因はpreviewKeyDown以外に考えられないのですが、対処法がわかりません。何かよいアイデアはないでしょうか?

A 回答 (3件)

なるほど、知りませんでした。

確かに WebBrowser コントロールの KeyDown は使用できないようになっているようですね。それで PreviewKeyDown を使われていると。

私のところでもページを読み込ませてみたところ再現しました。で、これについていろいろ調べてみて、以下のような MSDN フォーラムのスレッドを見つけました。

http://social.msdn.microsoft.com/Forums/en-US/cs …
ここではおそらくバグだろうという結論で、フラグを使って回避しているようです。

また、試してみたところ、PreviewKeyDown の中で e.IsInputKey = True を書くと、2回目の PreviewKeyDown は発生しないこともわかりました。

フラグを使って回避していると、もしこれがバグで、将来の .NET Framework のバージョンアップで修正されたときに動かなくなってしまう可能性もありますし、IsInputKey の方で対処するほうがよいのではないかと思います。一応 IsInputKey の意味的にも間違っていない使い方ですし。

この現象については、バグの可能性もあると思うので、MSDN フォーラムにフィードバックとして投稿してみるとよいと思います。

http://forums.microsoft.com/MSDN-JA/ShowForum.as …
    • good
    • 0
この回答へのお礼

なるほど!バグの可能性があるのですね・・・
それにしてもフラグでの対策はいやはや、なぜ思いつかなかったのか・・・ありがとうございます!おかげさまで解決できそうです。
ご丁寧にご教授していただき、ありがとうございました。
またわからないことがあればよろしくおねがいします。

お礼日時:2008/12/06 23:49

こういう場合、何らかのコードが悪さしている可能性がありますので、できるだけシンプルなコードで実験してみましょう。



私の環境で試してみましたが、再現しませんでした。手元に 2005 の環境がないので 2008 ですが。

Windows フォームアプリケーションプロジェクトを作成して、Form1 に WebBrowser を1つだけ置きます。コードは以下のように書きました。

Public Class Form1
Private Sub WebBrowser1_PreviewKeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles WebBrowser1.PreviewKeyDown
Debug.Print("PreviewKeyDown")
End Sub
End Class

キーを押すと PreviewKeyDown という文字が1回だけ出力されます。何か他のコードの影響で 2回PreviewKeyDown が発生しているのではないでしょうか?

関係ないかもしれませんが、基本的に PreviewKeyDown で直接処理を行わないほうがよいですよ。PreviewKeyDown は特殊キーを入力キーとして使いたいときに、IsInputKey を True にするためにあるものですから、実際の処理はその後に発生する KeyDown イベントで行うのが本来の使い方だと思います。

この回答への補足

提示していただいたコードで試してみたところ、確かに一回しか表示されませんでした。そのことを踏まえてデバッグを繰り返していて分かったのですが・・・どうやら2回コードが繰り替えされるのは、ブラウザ上にHTMLを表示している時だけ限定のようなのです。
試しにフォームにWebbrowserとtextBoxを1つずつ配置して

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
WebBrowser1.Navigate("http://oshiete1.goo.ne.jp/kotaeru_hosoku.php3?a= …
End Sub

Private Sub WebBrowser1_PreviewKeyDown(ByVal sender As System.Object, ByVal e As System.Windows.Forms.PreviewKeyDownEventArgs) Handles WebBrowser1.PreviewKeyDown
TextBox1.Text = TextBox1.Text + "Preview"
End Sub
End Class

としたところ、今までのように二回処理が繰り返され、一回のボタン入力でテキストボックスには「PreviewPreview」と表示されてしまいます。Webbrowserのプロパティで最初にURLを設定していても同じです。

今回どうしても「ブラウザ上でのキー入力を取得する」という機能が必要になるのでこの機能がなんとしても実現したいのですがKeyDownはこのコントロールでは使えないようで・・・解決策はないのでしょうか?

補足日時:2008/12/05 15:26
    • good
    • 0

ソースコードの貼り間違えですか?



My.Computer.Audio.Play("C:\WINDOWS\Media\Windows XP Shutdown.wav", AudioPlayMode.WaitToComplete)

ではないのですか?
これでも2回再生されますか?

この回答への補足

すみません、貼り付けミスでした。訂正されたコードで間違いありません。やはり2回再生されてしまうようです。

補足日時:2008/12/05 15:25
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A