
現在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も見ています
-
VB.NETでボタンのクリックイベントハンドラが2回実行される
Visual Basic(VBA)
-
矢印(左右)キーでイベントを発生させたい。
Visual Basic(VBA)
-
C#でButtonのフォーカス枠を消したいのですが
C言語・C++・C#
-
-
4
タブキー押下時のイベントをひろいたい。
Visual Basic(VBA)
-
5
CloseとDisposeの違い
Visual Basic(VBA)
-
6
Ctrl + Cなど複数の入力キーの感知
Visual Basic(VBA)
-
7
イベントにAddHandlerされているか判断
Visual Basic(VBA)
-
8
VB.NET ボタン押下で一つ前のコントロールへ
Visual Basic(VBA)
-
9
C# 超初心者です。 this.Refresh();という文を使いたいです
C言語・C++・C#
-
10
タブコントロールのフォーカス枠を消したい
Visual Basic(VBA)
-
11
DataGridViewのチェックボックスのON、OFFの判定方法
C言語・C++・C#
-
12
インスタンス参照でアクセスできない。代わりに型名?
C言語・C++・C#
-
13
C# KeyDownイベントでショートカットキーを設定すると実行時に鳴るシステム音を無効にしたい
C言語・C++・C#
-
14
[VB.net] DataGridViewのコンボボックス:部分一致等の機能追加
Visual Basic(VBA)
-
15
VB6.0の「vbFromUnicode」はVB.NETではどれに相当しますか?
Visual Basic(VBA)
-
16
日付型のフィールドに空白を入れる方法を教えてください
その他(データベース)
-
17
CSVファイルの中で、「 , 」カンマを使いたい
その他(コンピューター・テクノロジー)
-
18
VB.NETで他のプロジェクトで作成したフォームを使う方法
Visual Basic(VBA)
-
19
DataGridView 列ごとの入力制限
Visual Basic(VBA)
-
20
指定された引数が有効範囲にないエラー(VB.NET)
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Vba Array関数について教えてく...
-
【マクロ】シートの変数へ入れ...
-
【マクロ】並び替えの範囲が、...
-
エクセルのVBAコードと数式につ...
-
エクセルのマクロについて教え...
-
エクセルの改行について
-
【VBA】 結合セルに複数画像と...
-
vbsでのwebフォームへの入力制限?
-
算術演算子「¥」の意味について
-
【マクロ】売上一覧YYYYMMDDHHS...
-
【マクロ】開いているブックの...
-
Vba セルの4辺について罫線が有...
-
vb.net(vs2022)のtextboxのデザ...
-
ダブルクリックで貼り付けた画...
-
VBAの「To」という語句について
-
VBAでユーザーフォームを指定回...
-
VBAでCOPYを繰り返すと、処理が...
-
【マクロ】変数を使った、文字...
-
エクセルのVBAコードについて教...
-
ワードの図形にマクロを登録で...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Vba セルの4辺について罫線が有...
-
vbsでのwebフォームへの入力制限?
-
【ExcelVBA】5万行以上のデー...
-
【マクロ】売上一覧YYYYMMDDHHS...
-
【マクロ】開いているブックの...
-
【マクロ】並び替えの範囲が、...
-
エクセルの改行について
-
エクセルのマクロについて教え...
-
vb.net(vs2022)のtextboxのデザ...
-
VBAでCOPYを繰り返すと、処理が...
-
VBA ユーザーフォーム ボタンク...
-
エクセルのVBAコードと数式につ...
-
エクセルのVBAコードについて教...
-
[VB.net] ボタン(Flat)のEnable...
-
【マクロ】変数を使った、文字...
-
改行文字「vbCrLf」とは
-
質問58753 このコードでうまく...
-
【マクロ】シートの変数へ入れ...
-
ワードの図形にマクロを登録で...
-
算術演算子「¥」の意味について
おすすめ情報