@IT会議室は、ITエンジニアに特化した質問・回答コミュニティ「QA@IT」に生まれ変わりました。ぜひご利用ください。
- PR -

WebBrowserコントロールでInvokeMember("click")した場合の「待ち」の処理

1
投稿者投稿内容
けむ
会議室デビュー日: 2003/08/19
投稿数: 5
投稿日時: 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")した場合には、どのようにドキュメントの読み込み完了を
待てばよいのでしょうか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-13 16:40
ReadyState だけでなく、Busy についても合わせて見るのが古くからの伝統です。
System.Windows.Forms.WebBrowser クラスでは、IsBusy プロパティだったかと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
hei
ベテラン
会議室デビュー日: 2006/09/07
投稿数: 78
投稿日時: 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 ]
けむ
会議室デビュー日: 2003/08/19
投稿数: 5
投稿日時: 2007-01-21 00:10
heiさん、じゃんぬねっとさん情報ありがとうございました。
仕事がばたばたしていて遅くなってしまいましたが、試してみました。

IsBusyを追加しただけではだめだったんですが、heiさんのいわれるとおり
DoEvents()をwhileの前に追加したところ、期待通りの動作になりました。

ただ、これって何でなんでしょうかね・・・。ちょっと理解できない
動作なんですが・・・。
heiさん、理由ご存知ですかね?

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-01-21 11:59
引用:

けむさんの書き込み (2007-01-21 00:10) より:

ただ、これって何でなんでしょうかね・・・。ちょっと理解できない動作なんですが・・・。


ウィンドウズ メッセージの都合でしょう。
System.Windows.Forms.Application.DoEvents メソッドは、メッセージ ポンプの役割を果たします。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

スキルアップ/キャリアアップ(JOB@IT)