現在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以外に考えられないのですが、対処法がわかりません。何かよいアイデアはないでしょうか?
No.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 …
なるほど!バグの可能性があるのですね・・・
それにしてもフラグでの対策はいやはや、なぜ思いつかなかったのか・・・ありがとうございます!おかげさまで解決できそうです。
ご丁寧にご教授していただき、ありがとうございました。
またわからないことがあればよろしくおねがいします。
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 イベントで行うのが本来の使い方だと思います。
この回答への補足
提示していただいたコードで試してみたところ、確かに一回しか表示されませんでした。そのことを踏まえてデバッグを繰り返していて分かったのですが・・・どうやら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はこのコントロールでは使えないようで・・・解決策はないのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) EXCELのセル相互同期用のVBAでの不具合 3 2022/08/10 11:44
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Excel(エクセル) 【マクロ】スクショ印刷がうまく動かない件 5 2022/12/06 17:37
- Visual Basic(VBA) あるフォルダーのファイルを違う親フォルダーのサブフォルダーに移したい 11 2023/02/15 19:00
- その他(Microsoft Office) VBA メール送信済で実行されるはずが、実行されない時があります。 2 2023/02/02 14:05
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
C#でキーイベントが発生しないようです
C言語・C++・C#
-
[VB.net] DataGridViewの列ヘッダー複数行表示に伴う不具合?について
Visual Basic(VBA)
-
タブキー押下時のイベントをひろいたい。
Visual Basic(VBA)
-
-
4
frxファイルの役目
Visual Basic(VBA)
-
5
別フォームから戻ったときのイベント
Visual Basic(VBA)
-
6
VB.net Double と Decimal の違い?
Visual Basic(VBA)
-
7
SPREAD(GrapeCity)のセルにフォーカスを設定するにはどうしたらいいのでしょうか?
Visual Basic(VBA)
-
8
ボタンクリックイベント 重複防止について
C言語・C++・C#
-
9
DoEventsがやはり分からない
Visual Basic(VBA)
-
10
VB.NETで DataRow()を利用して、値からコードを取得したい。
Visual Basic(VBA)
-
11
文字数に合わせて、コントロールの幅を設定する方法
Visual Basic(VBA)
-
12
FORMが開いているかどうかの確認方法
Visual Basic(VBA)
-
13
ListView 項目の選択/選択解除について
Visual Basic(VBA)
-
14
Form_Load と Form_Activate のタイミング
Visual Basic(VBA)
-
15
KEYPREVIEW=TRUEについて。意味が分かりません・・。
Visual Basic(VBA)
-
16
TextBoxに半角数字のみの入力しかできないようにしたい
Visual Basic(VBA)
-
17
VB.NETでのイベントの途中終了
Visual Basic(VBA)
-
18
Hideについて(.NET)
Visual Basic(VBA)
-
19
文字列の後ろから必要分だけ削除したい。
Visual Basic(VBA)
-
20
データグリッドビューの一番最初の行に列を追加したい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
フィルターかけた後、重複を除...
-
ExcelのVBAコードについて教え...
-
1日に1人がこなせるプログラム...
-
Exel VBA 別ブックから該当デ...
-
VB6のComboBox関連の書き方をVB...
-
HTML電卓で1文字消す方法
-
VLookup関数を使ってラベルに表...
-
access2003 クエリSQL文に...
-
Excel VBA素人です。VBAで図形...
-
pythonにてseleniumを使うも、...
-
ExcelVBAで「Shift_JIS(MS932)...
-
エクセルに見えない文字(JISX0...
-
レポートでグループレベルの変...
-
chatgptでつくってもらったコー...
-
JANコードとPOSコードは同じ?
-
ACCESSで、履歴事項を管理する...
-
1、Rstudioで回帰直線を求める...
-
videopadについて
-
VBAでファイルオープン後にコー...
-
CheckBoxのコントロール配列に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
フィルターかけた後、重複を除...
-
access2003 クエリSQL文に...
-
1日に1人がこなせるプログラム...
-
Exel VBA 別ブックから該当デ...
-
pythonにてseleniumを使うも、...
-
ExcelのVBAコードについて教え...
-
ExcelのVBAコードについて教え...
-
chatgptでつくってもらったコー...
-
欠番の抽出について
-
JANコードとPOSコードは同じ?
-
JavaScriptの定数名が取り消し...
-
1、Rstudioで回帰直線を求める...
-
特定行の背景色を変えたいのですが
-
変数名「cur」について
-
PreviewKeyDownイベントが2回...
-
将来AIが進歩してくるにつれて...
-
ACCESSユニオンクエリでORDER B...
-
COBOLの文法
-
VBAでファイルオープン後にコー...
-
Nullの使い方が不正です。
おすすめ情報