タイトル : Re: VB WebBrowserでページの切り替えが思うように出来ない 投稿日 : 2015/08/14(Fri) 19:18 投稿者 : 魔界の仮面弁士
> 下記コードのようにループでページを切り替える方法がうまく > いきません。 アプリケーションがアイドル状態に入らないと、 WebBrowser がページを処理できないためです。 今回の件に限った話ではありませんが、 コントロールのイベント(Button1_Click など)には、 時間のかかる処理を書かないようにしましょう。 > なぜかNavigateの後にMsgBoxを入れるとその時点でページが変わり > HTMLを取得出来ます(MessageBox.Showでも可能)。 メッセージボックスの表示中は、 「他に処理が行われておらず、ユーザーからの操作を待っている状態」 にあたります。このため、アプリケーションがアイドル状態になったことで、 WebBrowser の処理を実行できる余裕が生まれたわけです。 > 順次タイマーイベントを発生させて タイマー利用時は、どのように処理させましたか? > コードが煩雑のため単純ループのような簡単な方法に変更したいです。 Timer の場合、タイマー通知は非同期的に行われますよね。 Start メソッドで呼びだした後、最初の Tick イベント発生までには、Interval 以上の時間を要します。 WebBrowser の場合も同様に、処理が非同期的に行われます。 Navigate メソッド呼びだし後、DocumentCompleted イベント発生までにはある程度の時間を要します。 使用しているオブジェクトが違うだけで、処理の流れとしては同じことです。 Public Class Form1 Private urlList As New List(Of String)() Private urlIndex As Integer = -1 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load urlList.Add("http://www.google.co.jp/") urlList.Add("http://www.microsoft.co.jp/") urlList.Add("http://www.apple.co.jp/") End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Button1.Enabled = False urlIndex = 0 Dim url As String = urlList(urlIndex) WebBrowser1.Navigate(url) End Sub Private Sub WebBrowser1_DocumentCompleted(sender As Object, _ e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted Debug.WriteLine("===============" & e.Url.ToString()) Debug.WriteLine(WebBrowser1.DocumentText) urlIndex += 1 If urlIndex < urlList.Count Then Dim url As String = urlList(urlIndex) WebBrowser1.Navigate(url) Else urlIndex = -1 Button1.Enabled = True End If End Sub End Class たとえば上記では、Button1_Click で Navigate した後、 直ちに End Sub に到達しているため、その時点でアイドル状態に入ります。 これならば、DocumentCompleted のイベントが発生すると思いますよ。 上記の Enumerator 版。 Enumerator は「For Each〜Next」時に内部で利用されているものですが、 管理としてはこちらの方が楽かもしれません。 Public Class Form1 Private urlList As New List(Of String)() Private nextUrl As List(Of String).Enumerator Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load urlList.Add("http://www.google.co.jp/") urlList.Add("http://www.microsoft.co.jp/") urlList.Add("http://www.apple.co.jp/") End Sub Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Button1.Enabled = False nextUrl = urlList.GetEnumerator() WebBrowser1.Navigate(nextUrl.Current) End Sub Private Sub WebBrowser1_DocumentCompleted(sender As Object, _ e As WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted Debug.WriteLine("===============" & e.Url.ToString()) Debug.WriteLine(WebBrowser1.DocumentText) If nextUrl.MoveNext() Then WebBrowser1.Navigate(nextUrl.Current) Else Button1.Enabled = True End If End Sub End Class |