【先着1,000名様!】1,000円分をプレゼント!

Cookieの削除について質問なのですが、
Internet ExplorerでインターネットオプションからCookieの削除を選択した場合は、すぐにそのCookieが無効になりますが、
手動でCookieフォルダの中身を削除した場合、ブラウザ自体を再起動しないと無効にならないようです・・・。(インターネットオプションの方は再起動を行っているのでしょうか?)

私はCookieをインターネットオプションのように削除を行うプログラムを制作したいと考えているのですが、どのようにプログラミングしたら良いのでしょう?


System.IO.File.Delete(削除目的のCookieのアドレス);

C#でこのコマンドを用いてプログラムを制作しているのですが、やはりブラウザ再起動という面で止まってしまっています。

どなたかアドバイスいただけたら幸いです。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

ANo.2のお礼への回答です。



私もC# 2005 Expressでやってみました。サンプルのコードを手直しして、一時ファイル、Cookie、履歴(Visited:)のListBox表示と、ListBoxで選択して削除に成功しました。履歴では削除できないものも検索されるようですが。

FindFirstUrlCacheEntry, FindNextUrlCacheEntryで検索したURLはlpszSourceUrlNameに求まっています。これを下記のようなコードでstringに取り出せば自由自在で、例えば先頭が"Cookie:"かどうかで選別できます。(なぜかFindFirstUrlCacheEntryの第1パラメータの指定には失敗し、全て検索されてしまいます)

.NETの経験には乏しいのでMarshalの使い方が正しいかは自信ありません。

string url = Marshal.PtrToStringAnsi(internetCacheEntry.lpszSourceUrlName);
 :
Marshal.FreeBSTR(internetCacheEntry.lpszSourceUrlName);

同様にファイル名はlpszLocalFileNameに求まっていますのでFile.Copyもできました。

また、IEのキャッシュに関する情報が下記にありました。相変わらず"Cache Groups"については良くわかってませんが、私がやってみたところではGroup外の検索で良さそうに思います。
Caching
http://msdn2.microsoft.com/en-gb/library/aa38392 …

この回答への補足

あとまた質問で申し訳ないのですが、
自分がNo2で参考にさせていただいたプログラムでよく分からないのが、グループとエントリーという言葉なんです。

グループは、関連するキャッシュの塊で
エントリーは削除されるべきグループ??

初歩的な質問で申し訳ありません。
もっともっと何度もプログラムを見直してみます。

補足日時:2006/12/26 02:04
    • good
    • 0
この回答へのお礼

すばやい返答ありがとうございました。

この回答を拝見させていただく限りでは、実現可能そうですね。
ただ自分はプログラミングに関して知識が乏しいので、実装に移るまで時間がかかるかと思われますので、先にお礼だけ述べさせていただきます。実装したらまた書き込みをさせていただきます。

ご丁寧にありがとうございました。

お礼日時:2006/12/26 00:56

ANo.3の補足への回答です。



私も"Cache Groups"については良くわかってませんが、たぶんグループを作ると、そのグループ内だけでキャッシュを再使用できたり、まとめて削除できたり、便利なこともあるのでしょう。しかし、どうやらIEでは使っていないようです。

エントリとはグループに属する/属さないに関わらず、一つの一時ファイル、Cookie、履歴のキャッシュのことを指していると思います。
FindFirstUrlCacheEntryではグループに属さないエントリを検索します。FindFirstUrlCacheEntryExを使えばGroupIdを指定してエントリを検索できるようです。

通常はFindFirstUrlCacheEntryを使用して"URLs that do not belong to any group"を処理すれば良いのではないでしょうか。

この回答への補足

お久しぶりです。色々参考になる意見ありがとうございました。
自分なりにいじくってみたのですが、うまくいきませんでした・・・。

IntPtrによってIpszSourceUrlNameとIpszLocalFileNameがどのような型で、どのようにURLとファイル名が保存されているのか分かりません・・・。Cの変数なら多少は分かるのですが・・・。

自分の中での解釈では、IpszSourceUrlNameとIpszLocalFileNameの中に入っている目的のファイルをMarchalで検索してstringに保存するということをANo.3でおっしゃっていたと捉えているのですが・・・。

もしよろしければ、ANo.3の回答でのFile.Copyとリスト表示が成功したサンプルプログラムを参考にさせていただけないでしょうか?

補足日時:2007/01/08 19:53
    • good
    • 0
この回答へのお礼

すばやい返答ありがとうございました。

色々いじくってみたいと思います。

ご丁寧な回答ありがとうございました。

お礼日時:2006/12/29 21:11

C#のサンプルを見つけました。

深く解読していないのですが私は"Group"を意識せずに検索しています。「WebBrowser コントロールをホストする場合」は意識する必要があるのだと思われます。

HOW TO: アプリケーションがビジュアルC#.NETの WebBrowser コントロールをホストする場合、キャッシュを消去します。
http://support.microsoft.com/kb/326201/ja
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございました。
2005では動かなかったのですが、2003で実行するとTemporary Internet Filesの内容を削除することに成功しました。どうもありがとうございました。

今度は全てではなく、指定したファイルだけを他のフォルダに移動ということをやってみたいのですが、自分なりにプログラムを解読してみたのですが、難しくてうまく解読できず、実行に移れませんでした。(やはり当初の目的としては削除目的のCookieだけを何とかしたかったので)

もし、お時間があれば、Temporary Internet Filesの中にある指定のファイルを他のフォルダに移動させる方法をお教え願えませんでしょうか?
質問ばかりで申し訳ありません。

お礼日時:2006/12/23 20:58

C#でやったことはありませんが、IEのCookieの削除はDeleteUrlCacheEntry APIで可能です。

再起動しなくても無効になります。

FindFirstUrlCacheEntry, FindNextUrlCacheEntryで一時ファイル、Cookie、履歴を検索してリストし、選択したCookieをDeleteUrlCacheEntryで削除できました。Windows98 + Delphi4で作ったものですが、Windows XP Pro SP2 + Delphi7でも動きました。

VistaではCookieがうまく検索できないという情報がありますね。削除もできないかもしれません。

FindFirstUrlCacheEntry and COOKIE_CACHE_ENTRY
http://forums.microsoft.com/MSDN/ShowPost.aspx?P …
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QWebBrowserを使ってプルダウンを操作するには?

WebBrowserを使ってComboboxで選んだやつをWeb上のプルダウンに反映させたいのですがどうしたらいいでしょうか。
Comboboxは
4日
5日
6日
7日
ソースを見るとこのようになっていました。
<select name="date">
<option value="4">4日 
<option value="5">5日
<option value="6">6日 
<option value="7" selected>7日 
</select>
どなたかわかる方がいましたら教えていただけませんか。
初心者なのでわかりやすくお願い致します。

Aベストアンサー

お世話になります。

教えて!goo の検索オプションの一部を操作する画面を作ってみました。

該当するのは以下の箇所です。
============================================================
<tr>
<td align="center" valign="middle" nowrap bgcolor="#E6E6E6"><b><font size="-1">カテゴリ指定</font></b></td>
<td bgcolor="#efefef">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
<input type="radio" name="ct_select" value="0" checked onClick="disableCT()">
<font size="-1">指定しない</font></td>
<td></td>
</tr>
<tr>
<td valign="top">
<input type="radio" name="ct_select" value="1" onClick="effectiveCT()">
<font size="-1">指定する</font></td>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="2">
<tr>
<td>

<select size="1" id="ct0" name="ct0" onChange="change(this.form)" style="width:200;"><option value="" selected>大カテゴリー</option><option value="214">ライフ</option><option value="207">デジタルライフ</option><option value="212">趣味</option><option value="209">エンターテインメント</option><option value="211">美容&健康</option><option value="206">ビジネス&キャリア</option><option value="208">社会</option><option value="213">マネー</option><option value="210">学問&教育</option><option value="932">[地域情報] 旅行・レジャー・生活</option><option value="205">[技術者向] コンピューター</option><option value="713">【特設】アンケート</option><option value="517">このQ&Aコミュニティーについて</option></select>
</td>
</tr>
============================================================

Form に WebBrowser と Button を 1 つずつデザイナで貼り付け、
以下のコードを書いて実行して Button を押下すると、
http://oshiete.goo.ne.jp/search/search.php の
カテゴリ指定のところが
『指定する』にチェックが入り、大カテゴリが『[技術者向]コンピューター』になります。

Public Class Form1
  Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Me.Button1.Enabled = False
    Me.WebBrowser1.Navigate("http://oshiete.goo.ne.jp/search/search.php")
  End Sub

  Private Sub WebBrowser1_DocumentCompleted(ByVal sender As Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
    Me.Button1.Enabled = True
  End Sub

  Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

    ' 「指定する」ラジオボタンにチェックを入れる
    Me.WebBrowser1.Document.All.GetElementsByName("ct_select")(1).InvokeMember("click")

    ' 最初の ComboBox を取得する
    Dim firstCombo As HtmlElement = Me.WebBrowser1.Document.GetElementById("ct0")

    ' ComboBox の値を設定する
    firstCombo.SetAttribute("selectedindex", "11")
  End Sub
End Class

お世話になります。

教えて!goo の検索オプションの一部を操作する画面を作ってみました。

該当するのは以下の箇所です。
============================================================
<tr>
<td align="center" valign="middle" nowrap bgcolor="#E6E6E6"><b><font size="-1">カテゴリ指定</font></b></td>
<td bgcolor="#efefef">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
<input type="radio" name="ct_select" value="0" checked onClick="disableCT()">
<font size...続きを読む

QWebBrowser内のフォームをsubmitする(VB2008)

VB2008でWebBrowserコントロール内のsubmitボタンを以下のコードでクリックしようとしているのですが、

WebBrowser1.Document.Forms("フォームの名前").InvokeMember("submit")

NullReferenceExceptionはハンドルされませんでした。
オブジェクト参照がオブジェクト インスタンスに設定されていません。
というエラーが出ます。

ボタンがフォームの中ではなく、tableの中に配置されているようで、idも指定されておらず、nameとvalueだけ指定されているのですが何か方法はないでしょうか。
どなたかお願いします。

Aベストアンサー

IE7以上でVB2008だと、VBA(VB6)の"InternetExplorer.application"オブジェクトが何故か動きません(参照設定しても)
VB2008でWebBrowserコントロールオブジェクトを使うときは、今一面倒です。

ご質問のケースでは、<form>タグが無いのですね。このような時は、
<input type"submit" ...>のタグを探してInvokeMember("click")するしかないでしょう。
探し方は、いろいろありますが、一例を挙げると、
WebBrowser1.Document.GetElementsByTagName("input").Count
の数だけループして
webBrowser1.Document.GetElementsByTagName("input").Item(i).GetAttribute("Type").ToString
の値が "submit" の要素を見つけて
WebBrowser1.Document.GetElementsByTagName("input").Item(i).InvokeMember("click")
です。

IE7以上でVB2008だと、VBA(VB6)の"InternetExplorer.application"オブジェクトが何故か動きません(参照設定しても)
VB2008でWebBrowserコントロールオブジェクトを使うときは、今一面倒です。

ご質問のケースでは、<form>タグが無いのですね。このような時は、
<input type"submit" ...>のタグを探してInvokeMember("click")するしかないでしょう。
探し方は、いろいろありますが、一例を挙げると、
WebBrowser1.Document.GetElementsByTagName("input").Count
の数だけループして
webBrowser1.Documen...続きを読む

QUWSCのIE操作でプルダウンを選択する方法

UWSCのIE操作でプルダウンを選択する方法がわからなく、
記録機能を使い試してみたのですがうまくいきませんでした。

どなたか教えていただけないでしょうか。
よろしくお願いします。


IE = CREATEOLEOBJ("InternetExplorer.Application")
IE.visible = true

IE.navigate("http://sportsnavi.yahoo.co.jp/")
waiting(IE)

IELINK(IE,"Jリーグ")
waiting(IE)

IELINK(IE,"日程&結果",2)
waiting(IE)


//ここがうまく行かないところです。記録で出てきたものをそのまま使用
CLKITEM(IE, "第22節", CLK_ACC)


//読み込み待ち
Procedure waiting(IE)
while IE.busy or IE.readyState<>4
Sleep(0.5)
wend
Fend

Aベストアンサー

 CLKITEM(IE, "第22節", CLK_ACC)

 IE.document.getElementsByName("select").item[2].value="index_2nd.html#j22"
 IE.document.getElementsByName("select").item[2].fireEvent("OnChange")
に変更すればいけると思います。

しかし、そもそも
 IE.navigate("http://sportsnavi.yahoo.co.jp/")

 IE.navigate("http://sportsnavi.yahoo.co.jp/soccer/jleague/2012/data/result/index_2nd.html#j22")
に変更すれば目的は達成されるような気がするのですが……
(来年度はたぶん2012が2013になるだけです。)

あと、IEの操作を記録したいのであれば、Pro版を購入してRecIEを使用したほうがいいと思います。

QWebBrowserに表示されているページのソースの取得方法

RichTextBox1.Text =WebBrowser1.Document.body.innertext
とすれば表示されている文字は取得できるのですがタグ付きのソースは
取得できません。

webBrowserコントロールに表示されている文字だけでなくタグもいっしょに
取得するにはどうすればよいのでしょうか

Aベストアンサー

WebBrowser1.Document.body.outerHTML
で取得できると思います。

Q自動ログインについてプログラムで実現したい。

以前も似たような質問をしたのですが、改めて質問させていただきます。
http://pasokon-yugi.cool.ne.jp/AutoLogOn/
のように自動でログインしたいのですが、これだと、Cookieが返ってこない?
一般的なログインとは違う結果が出るように思えます。(mixiのバージョンでやってみました。)

このHTML文書を利用してCookieを返してくれるようにする方法、
または、同様の自動ログインのプログラム(言語は何でも構いません。)をご存知でしたらご教授願えませんか?よろしくお願いします。

Aベストアンサー

以前の似たような質問とは下記でしょうか。
http://oshiete1.goo.ne.jp/qa2619481.html

現在の質問の趣旨とは違いますが、まずはCookieがコピーできればよろしいでしょうか。

と、勝手に解釈しまして以前と同じMSのC#サンプルコードを使います。
http://support.microsoft.com/kb/326201/ja

さしあたり処理の流れは考えずにサンプル中の下記の行の上にコードを追加します。
returnValue = DeleteUrlCacheEntry(internetCacheEntry.lpszSourceUrlName);

【追加コード】
-----
string url = Marshal.PtrToStringAnsi(internetCacheEntry.lpszSourceUrlName);
if (url.Substring(0,7)=="Cookie:")
{
string fname = Marshal.PtrToStringAnsi(internetCacheEntry.lpszLocalFileName);
System.IO.File.Copy(fname, "C:\\" + System.IO.Path.GetFileName(fname));
}
Marshal.FreeBSTR(internetCacheEntry.lpszSourceUrlName);
Marshal.FreeBSTR(internetCacheEntry.lpszLocalFileName);
-----

"C:\\"下にCookieファイルをコピーします。"C:\\"では具合が悪いでしょうから適切に変更して下さい。また、最後のMarshal…の2行はループ外に出した方が効率がよいでしょう。C# 2005 Expressで確認しました。

以前の似たような質問とは下記でしょうか。
http://oshiete1.goo.ne.jp/qa2619481.html

現在の質問の趣旨とは違いますが、まずはCookieがコピーできればよろしいでしょうか。

と、勝手に解釈しまして以前と同じMSのC#サンプルコードを使います。
http://support.microsoft.com/kb/326201/ja

さしあたり処理の流れは考えずにサンプル中の下記の行の上にコードを追加します。
returnValue = DeleteUrlCacheEntry(internetCacheEntry.lpszSourceUrlName);

【追加コード】
-----
string url = Marsha...続きを読む

Qキーボードでチェックボックスにチェックをいれたい。

よろしくお願いします。
今、インターネットのフォームで、チェックボックスにチェックを入れたいと思っているのですが、マウスがきかないため、チェックボックスにチェックがいれられません。
ある程度マウスがなくても操作はできるのですが、チェックボックスのチェックの入れ方だけがわかりません。

そこで質問なのですが、キーボード操作でチェックボックスにチェックをいれる方法どなたかご存知ないでしょうか?
よろしくお願いします

Aベストアンサー

項目間は、タブキーで移動し、チェックボックスをチェックするには、スペースキーを押してみてください。

Q他のウィンドウのボタンを自動的に押したい

VisualC++で作ったアプリケーションから、例えばWindowsに標準搭載の「電卓アプリケーション」のウィンドウをアクティブにして、さらにその中の「1」ボタンを認識して押す、テキストボックスを認識してそこに文字列を入れるといったソフトを作りたいです。

簡単にいうと、他のアプリケーションを自動的に操作するソフトを作りたいのです。

これを実現するために、Web検索してみましたが、関連する技術の名前やMFCでのAPI名がわからないです。これはどういった名前の技術で、VisualC++でどういった名前の関数を使うのでしょうか?

当方の環境はWindowsXP&VisualC++6.0です。

以上、よろしくお願いします。

Aベストアンサー

★列挙方法のアドバイス
・補足になる仕様の
>(1)ウィンドウのタイトルバーの名前(例:「電卓」)、
>またはウィンドウのIDでウィンドウを探す
 ↑
 これなら FindWindow() 関数でウインドウ・ハンドルを探せます。
 例: HWND hWnd = FindWindow( "SciCalc", "電卓" );
>(2)最初にヒットしたウィンドウをアクティブにする
 ↑
 最初にヒットした hWnd を SetForegroundWindow() 関数でアクティブにします。
 例: SetForegroundWindow( hWnd );
>(3)アクティブにしたウィンドウの中にあるボタンを探す
 ↑
 (1)で取得しているウインドウに対して子ウインドウ(ボタンなど)を列挙します。
 列挙には EnumChildWindows() 関数と EnumChildProc() のコールバック関数を使います。
>(4)「1」のボタン、またはボタンのIDがヒットしたらそのボタンを押す
 ↑
 列挙のコールバック関数(EnumChildProc)でボタンのキャプションを調べて
 『1』となっている文字列が電卓の『1』ボタンです。
 このときにボタンを押す処理をプログラムから行います。
 例: SendMessage( hChild, BM_CLICK, 0, 0 );
 URL: http://wisdom.sakura.ne.jp/system/winapi/win32/win53.html
・上記のような感じで操作できます。
 一番重要なのは操作するウインドウのハンドルを正しく見つけ出すことです。
 このウインドウ・ハンドルを見つけるには次の方法があります。
 (1)FindWindow() 関数を使う
 (2)EnumWindows() 関数を使う
 (3)Process32First()、Process32Next() 関数を使う
 (4)EnumProcesses() 関数を使う
 などがあります。
 今回は簡単な(1)を紹介しました。
 もしもウインドウのクラス名やキャプション名以外で詳しく捜査対象の
 ウインドウを検索するには(2)の EnumWindows() 関数や起動パス名を
 調べて特定できる (3)、(4)の関数群を利用します。
>テキストの内容の認識や保存など色々な機能を盛り込んだソフトを作りたいからです。
 ↑
 ボタンなどのテキストを認識、保存には GetWindowText()、WM_GETTEXT メッセージを
 使います。メッセージの場合は SendMessage() 関数でキャプション文字列を取得します。
 例: SendMessage( hChild, WM_GETTEXT, sizeof(szBuff), szBuff );
・下に簡単なボタンの列挙を載せます。これを活用して下さい。

サンプル:
#include <stdio.h>
#include <windows.h>

// コールバック関数
BOOL CALLBACK EnumChildProc( HWND hWnd, LPARAM lParam )
{
 TCHAR szBuff[ 1024 ];
 
 // キャプションの取得
 GetWindowText( hWnd, szBuff, sizeof(szBuff) );
 printf( "├[%s]\n", szBuff );
 return TRUE;
}

// メイン関数
int main( void )
{
 HWND hCalc;
 
 if ( (hCalc = FindWindow("SciCalc","電卓")) != NULL ){
  printf( "◆電卓のコントロール列挙\n" );
  EnumChildWindows( hCalc, EnumChildProc, NULL );
 }
 return 0;
}
以上。

★列挙方法のアドバイス
・補足になる仕様の
>(1)ウィンドウのタイトルバーの名前(例:「電卓」)、
>またはウィンドウのIDでウィンドウを探す
 ↑
 これなら FindWindow() 関数でウインドウ・ハンドルを探せます。
 例: HWND hWnd = FindWindow( "SciCalc", "電卓" );
>(2)最初にヒットしたウィンドウをアクティブにする
 ↑
 最初にヒットした hWnd を SetForegroundWindow() 関数でアクティブにします。
 例: SetForegroundWindow( hWnd );
>(3)アクティブにしたウィンドウの中にあるボタンを...続きを読む

QWSHのIEオブジェクト操作後のクッキーの削除方法

WSHでIEオブジェクトでナヴィゲートしたページの
クッキーを、WSHから削除するにはどのようにすれば良いですか?
単にIEのキャシュファイルの全削除だと、
そのクッキーファイルが他から利用されている場合エラーが出そう
なので他の方法も無いかと思い質問しました。

Aベストアンサー

たとえばこんな感じで・・・

接続先:http://example.com/test.htm
WSH:test.vbs

#test.htm

<script>
document.cookie="hoge=1";
document.write(document.cookie);
</script>
<input type="button" value="cookie" onclick="alert(document.cookie)">

これで、起動するたびにhogeに1をいれます。
画面上にクッキー情報が表示され、ボタンをおしても同じ情報が
表示されます

#test.vbs

URL="http://example.com/test.htm"
set oIE=Wscript.CreateObject("InternetExplorer.application")
oIE.navigate2(URL)
oIE.visible=true
oIE.document.cookie="hoge=; expires=Thu, 1-Jan-1970 00:00:00;"
msgbox oIE.document.cookie

test.htmを呼び出し後、クッキーのhogeキーを削除していますので
msgboxではhogeが表示されません。
ボタンをおしても表示されないことがわかると思います

たとえばこんな感じで・・・

接続先:http://example.com/test.htm
WSH:test.vbs

#test.htm

<script>
document.cookie="hoge=1";
document.write(document.cookie);
</script>
<input type="button" value="cookie" onclick="alert(document.cookie)">

これで、起動するたびにhogeに1をいれます。
画面上にクッキー情報が表示され、ボタンをおしても同じ情報が
表示されます

#test.vbs

URL="http://example.com/test.htm"
set oIE=Wscript.CreateObject("InternetExplorer.application"...続きを読む

QUWSCでエラー発生時の対処法について

UWSCで、エラーが発生したときに、特定の行、または指定されたファンクションへ飛ばしたいのですが、その方法はありますでしょうか?VBでいうOnErrorステートメントと同じ役割ができるものを探しています。

UWSCはエラーがでると、強制終了されてしまい、その後のプログラムの実行が止まってしまいますので、これを回避するためです。

当方、プログラムは素人ではありませんが、UWSCは始めてです。もし分かる方がいましたら、教えていただけませんでしょうか?

Aベストアンサー

こんにちは。

>UWSCはエラーがでると、強制終了されてしまい、その後のプログラムの実行が止まってしまいますので、これを回避するためです。

ANo.1 記載の通り、try ~ except ~ endtry で except 句に、実行時エラーが発生した時の処理を入れておくのがよいと思います。実行時エラーの種類によっては、もはやスクリプトエンジンの処理を中断する類のものと判断される場合があります。その場合はエラーをキャッチできません。

それも救済したい場合は、該当ロジックを別ファイル A.uws に切り出して、EXEC で UWSC.exe A.uws と起動させる。A.uws が異常終了しても EXEC した側の UWSC.exe は影響を受けない。そんな風に影響範囲を局所化することも可能ではあります。

Q正しいWebBrowserの使い方(ループ判定)

VB2008を使っています。WebBrowserのコンポーネントを使って
ホームページにGET形式でパラメータを渡して画面のBODY部分を読み取る
ものを作っているのですが、サーバーのレスポンスにもよりますが
1分間に20回で5分(100回程度)連続アクセスをするのですが、
以下のルーチンの場合何か不安を感じまして、
ネットでこれを使えばOKというものが無くて
確実に読み取る方法が知りたくて質問いたしました。
やはり、2つ目のイベントを用いる方が安心でしょうか?
正しいWebBrowserの使い方(ループ判定)をご存知の方教えてください。


'***** WebBrowser1.ReadyState *****

WebBrowser1.Navigate(URL)
Do While WebBrowser1.ReadyState <> WebBrowserReadyState.Complete Or WebBrowser1.IsBusy = True
Application.DoEvents()
Loop
data = WebBrowser1.DocumentText



'***** DocumentCompletedイベントまでループ *****

public wait_flag as Boolean

wait_flag = True
WebBrowser1.Navigate(URL)
Do While (WebBrowser1.IsBusy = True) Or (wait_flag = True)
Application.DoEvents()
Loop
data = WebBrowser1.DocumentText


'---- イベント -----
Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
wait_flag = False
End Sub

VB2008を使っています。WebBrowserのコンポーネントを使って
ホームページにGET形式でパラメータを渡して画面のBODY部分を読み取る
ものを作っているのですが、サーバーのレスポンスにもよりますが
1分間に20回で5分(100回程度)連続アクセスをするのですが、
以下のルーチンの場合何か不安を感じまして、
ネットでこれを使えばOKというものが無くて
確実に読み取る方法が知りたくて質問いたしました。
やはり、2つ目のイベントを用いる方が安心でしょうか?
正しいWebBrowserの使い方(ループ判定)を...続きを読む

Aベストアンサー

正しいのかどうかわからないし、好みの問題かもしれませんが、、

  [MSDN 引用]
  http://msdn.microsoft.com/ja-jp/library/system.windows.forms.webbrowser.documentcompleted.aspx

  DocumentCompleted イベントが発生したときには、新しいドキュメントが
  完全に読み込まれています。つまり Document プロパティ、DocumentText
  プロパティ、または DocumentStream プロパティを使用してドキュメント
  のコンテンツにアクセスできます。

とあるので、DocumentCompleted イベントを利用した方法が良いでしょう。
ただし、フレームを切ったページではフレームごとに DocumentCompleted が
発生するため、完全にページが読み込まれたかどうかを判定するには e.Url
が目的の URL を差しているか調べる必要はあります。

それから、DocumentCompleted イベントを利用するのであれば、ループで待機
せず、イベント内で次の処理をすればいいのでは?


Private m_Url   As String
Private m_BodyText As String

Private Sub Button1_Click() Handles Button1.Click

  m_BodyText = ""
  m_Url = "目的の URL"
  WebBrowser1.Navigate(m_Url)

End Sub

Private Sub WebBrowser1_DocumentCompleted( _
  ByVal sender As System.Object, _
  ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs _
) Handles WebBrowser1.DocumentCompleted

  If e.Url.ToString() = m_Url Then
    m_BodyText = WebBrowser1.DocumentText
  End If

End Sub

正しいのかどうかわからないし、好みの問題かもしれませんが、、

  [MSDN 引用]
  http://msdn.microsoft.com/ja-jp/library/system.windows.forms.webbrowser.documentcompleted.aspx

  DocumentCompleted イベントが発生したときには、新しいドキュメントが
  完全に読み込まれています。つまり Document プロパティ、DocumentText
  プロパティ、または DocumentStream プロパティを使用してドキュメント
  のコンテンツにアクセスできます。

とあるので、DocumentCompleted イベン...続きを読む


人気Q&Aランキング