• ベストアンサー

PreviewKeyDownイベントが2回発生する

現在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以外に考えられないのですが、対処法がわかりません。何かよいアイデアはないでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • ttkai00
  • ベストアンサー率58% (18/31)
回答No.3

なるほど、知りませんでした。確かに WebBrowser コントロールの KeyDown は使用できないようになっているようですね。それで PreviewKeyDown を使われていると。 私のところでもページを読み込ませてみたところ再現しました。で、これについていろいろ調べてみて、以下のような MSDN フォーラムのスレッドを見つけました。 http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/f83d3d71-ea3e-4b18-a610-30a91fae060e/ ここではおそらくバグだろうという結論で、フラグを使って回避しているようです。 また、試してみたところ、PreviewKeyDown の中で e.IsInputKey = True を書くと、2回目の PreviewKeyDown は発生しないこともわかりました。 フラグを使って回避していると、もしこれがバグで、将来の .NET Framework のバージョンアップで修正されたときに動かなくなってしまう可能性もありますし、IsInputKey の方で対処するほうがよいのではないかと思います。一応 IsInputKey の意味的にも間違っていない使い方ですし。 この現象については、バグの可能性もあると思うので、MSDN フォーラムにフィードバックとして投稿してみるとよいと思います。 http://forums.microsoft.com/MSDN-JA/ShowForum.aspx?ForumID=183&SiteID=7

vandread
質問者

お礼

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

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • ttkai00
  • ベストアンサー率58% (18/31)
回答No.2

こういう場合、何らかのコードが悪さしている可能性がありますので、できるだけシンプルなコードで実験してみましょう。 私の環境で試してみましたが、再現しませんでした。手元に 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 イベントで行うのが本来の使い方だと思います。

vandread
質問者

補足

提示していただいたコードで試してみたところ、確かに一回しか表示されませんでした。そのことを踏まえてデバッグを繰り返していて分かったのですが・・・どうやら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=13509819") 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はこのコントロールでは使えないようで・・・解決策はないのでしょうか?

すると、全ての回答が全文表示されます。
  • korin_
  • ベストアンサー率69% (46/66)
回答No.1

ソースコードの貼り間違えですか? My.Computer.Audio.Play("C:\WINDOWS\Media\Windows XP Shutdown.wav", AudioPlayMode.WaitToComplete) ではないのですか? これでも2回再生されますか?

vandread
質問者

補足

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

すると、全ての回答が全文表示されます。

関連するQ&A