- - PR -
WebBrowserコントロールでInvokeMember("click")した場合の「待ち」の処理
1
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-01-13 16:12
WebBrowserコントロールを使って、自動巡回的なアプリを作っています。
言語はC#、環境は.NET 2.0です。 読み込んだHTMLを解析してリンクをたどっていくような場合、Navigateしてから ドキュメントの読み込みが完了するまで待ってから解析を行う必要がありますが、 私の場合以下のようなコードで対応しています。 while (cBrowser.ReadyState != WebBrowserReadyState.Complete) { Application.DoEvents(); } 今回問題となっているのは、フォームのボタンを押したい場合はNavigateでは なく cBrowser.Document.All.GetElementsByName("input")[0].InvokeMember("click"); のようにページの遷移を行っていますが、この場合上記の処理ではドキュメントの 完了を待たずにループを抜けてしまいます。(実際にはInvokeMember("click") した直後にCompleteになっています) InvokeMember("click")した場合には、どのようにドキュメントの読み込み完了を 待てばよいのでしょうか? | ||||
|
投稿日時: 2007-01-13 16:40
ReadyState だけでなく、Busy についても合わせて見るのが古くからの伝統です。
System.Windows.Forms.WebBrowser クラスでは、IsBusy プロパティだったかと思います。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2007-01-14 17:30
以前私も悩みましたが、
whileのループの前にDoEventsを入れると解決しました。 htmlElement.InvokeMember("clikc") Application.DoEvents() While browser.IsBusy OrElse browser.ReadyState <> WebBrowserReadyState.Complete Application.DoEvents() End While [ メッセージ編集済み 編集者: hei 編集日時 2007-01-14 17:38 ] | ||||
|
投稿日時: 2007-01-21 00:10
heiさん、じゃんぬねっとさん情報ありがとうございました。
仕事がばたばたしていて遅くなってしまいましたが、試してみました。 IsBusyを追加しただけではだめだったんですが、heiさんのいわれるとおり DoEvents()をwhileの前に追加したところ、期待通りの動作になりました。 ただ、これって何でなんでしょうかね・・・。ちょっと理解できない 動作なんですが・・・。 heiさん、理由ご存知ですかね? | ||||
|
投稿日時: 2007-01-21 11:59
ウィンドウズ メッセージの都合でしょう。 System.Windows.Forms.Application.DoEvents メソッドは、メッセージ ポンプの役割を果たします。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |
1