トップ回答者
WebBrowserをオフラインにするには

質問
回答
-
ドキュメントには設定できると書いてあるわりに set は公開されていないんですね。
typeof(IWebBrowser2).InvokeMember(
"IsOffline", BindingFlags.SetProperty, null,
this.webBrowser1.ActiveXInstance, new object[] { true }, new CultureInfo(0x409));みたいなかんじで設定できるかもしれません。(適当に書いているので、もうちょっと直さないとダメかもですが)
- 編集済み K. Takaoka 2012年11月1日 3:07
- 回答としてマーク 村尾DOS 2012年11月3日 7:20
-
> 「エラー CS0246: 型または名前空間名 'IWebBrowser2' が見つかりませんでし
> た。」というメッセージが出ます。IWebBrowser2 は COM コンポーネント(インターフェイス)ですので、.NET から直接参照することはできないはずです。
COM 相互運用という機能を利用すれば、.NET からの COM コンポーネントを呼び出すことができます。詳しくは下記のページ祖見てください。
Microsoft .NET/COM の移行と相互運用性
http://msdn.microsoft.com/ja-jp/library/ms978506.aspx以下のページによると、IWebBrowser2 インターフェイスの Offline プロパティ(COM コンポーネントです)にオフラインにする機能があるようです。COM 相互運用で提供されている機能を利用して Offline プロパティの COM ラッパーを生成し、それを操作すればオフラインにすることが可能と思います。(検証はしてませんが)
Offline property
http://msdn.microsoft.com/en-us/library/aa752061(v=vs.85).aspx具体的には、Offline プロパティではありませんが、同じ IWebBrowser2 インターフェイスの Application プロパティと RegisterAsBrowser プロパティの COM ラッパーを作成した例が以下のページにありますので参考にしてください。
WebBrowser の拡張
http://surferonwww.info/BlogEngine/post/2012/07/01/extension-of-webbrowser-control.aspxちなみに、Offline プロパティの定義は下記です。
[DispId(550)]
bool Offline { get; set; }
WebBrowser の拡張についてもっと詳しく知りたい場合は、以下のページが参考になると思います。Extended .NET 2.0 WebBrowser Control
http://www.codeproject.com/Articles/13598/Extended-NET-2-0-WebBrowser-Control- 回答としてマーク 村尾DOS 2012年11月3日 7:19
すべての返信
-
ドキュメントには設定できると書いてあるわりに set は公開されていないんですね。
typeof(IWebBrowser2).InvokeMember(
"IsOffline", BindingFlags.SetProperty, null,
this.webBrowser1.ActiveXInstance, new object[] { true }, new CultureInfo(0x409));みたいなかんじで設定できるかもしれません。(適当に書いているので、もうちょっと直さないとダメかもですが)
- 編集済み K. Takaoka 2012年11月1日 3:07
- 回答としてマーク 村尾DOS 2012年11月3日 7:20
-
> 「エラー CS0246: 型または名前空間名 'IWebBrowser2' が見つかりませんでし
> た。」というメッセージが出ます。IWebBrowser2 は COM コンポーネント(インターフェイス)ですので、.NET から直接参照することはできないはずです。
COM 相互運用という機能を利用すれば、.NET からの COM コンポーネントを呼び出すことができます。詳しくは下記のページ祖見てください。
Microsoft .NET/COM の移行と相互運用性
http://msdn.microsoft.com/ja-jp/library/ms978506.aspx以下のページによると、IWebBrowser2 インターフェイスの Offline プロパティ(COM コンポーネントです)にオフラインにする機能があるようです。COM 相互運用で提供されている機能を利用して Offline プロパティの COM ラッパーを生成し、それを操作すればオフラインにすることが可能と思います。(検証はしてませんが)
Offline property
http://msdn.microsoft.com/en-us/library/aa752061(v=vs.85).aspx具体的には、Offline プロパティではありませんが、同じ IWebBrowser2 インターフェイスの Application プロパティと RegisterAsBrowser プロパティの COM ラッパーを作成した例が以下のページにありますので参考にしてください。
WebBrowser の拡張
http://surferonwww.info/BlogEngine/post/2012/07/01/extension-of-webbrowser-control.aspxちなみに、Offline プロパティの定義は下記です。
[DispId(550)]
bool Offline { get; set; }
WebBrowser の拡張についてもっと詳しく知りたい場合は、以下のページが参考になると思います。Extended .NET 2.0 WebBrowser Control
http://www.codeproject.com/Articles/13598/Extended-NET-2-0-WebBrowser-Control- 回答としてマーク 村尾DOS 2012年11月3日 7:19
-
(試してませんが) typeof(IWebBrowser2) のかわりに ActiveXInstance.GetType() でも大丈夫だと思います。(__ComObject みたいなものが取れたと思いますが、結果的に同じ動作をするはずなので)
既に書かれているように、WebBrowser コンポーネントでは IsOffline という名前ですが、IWebBrowser2 では IsOffline ではなく Offline なので、Invoke に与える名前を変更する必要がありますね。
this.webBrowser1.ActiveXInstance.GetType()
.InvokeMember(
"Offline", BindingFlags.SetProperty, null,
this.webBrowser1.ActiveXInstance, new object[] { true }, new CultureInfo(0x409));WebBrowser コントロールの IsOffline プロパティのヘルプを開けば、一番下のほうに IWebBrowser2 のリンクがありますので、そこから IWebBrowser2 について調べることができます。WebBrowser コントロールの IsOffline プロパティに対応した IWebBrowser2 の機能が Offline プロパティであろうことを確認したり、ページの最後のほうには、この COM コンポーネントが SHDOCVW.DLL に実装されていることが記載されています。
このことから、参照設定で「COM」のタブから SHDOCVW.DLL を探して参照設定すれば typeof(WebBrowser2) という記述もできるようになることもわかるようになっています。(インポートされた namespace に対して using を追加しないとダメですが、Visual Studio でコンテキストメニューから解決をさせればどこにあるかは探さなくても大丈夫でしょう)
※ とはいえ、こいつは COM タブに SHDOCVW.DLL が載っていないので、参照タブを利用して Windows の System32 等から SHDOCVW.DLL を探すことになるでしょう。(一般的な手順としては COM タブから探します)- 編集済み K. Takaoka 2012年11月3日 10:35
-
K. Takaoka さん>
> このことから、参照設定で「COM」のタブから SHDOCVW.DLL を探して参照設定すれば
それは .NET Framework の WebBrowser を拡張して操作するのではなく、COM の web
browser control (ShDocVw.dll) のラッパーを作ってそれを操作するということになる
のではありませんか?であれば、SDK に含まれている Aximp.exe を使用するか Visual Studio の機能を利用
して(こちらの方が簡単かつ確実・・・下記ページ参照)、COM の web browser control
用の共通言語ランタイムプロキシ (SHDocVw.dll) および Windows フォームプロキシ
(AxSHDocVw.dll) を作って、それを操作するほうが確実ではないでしょうか?SHDocVw.dll と AxSHDocVw.dll の作り方と使い方
http://surferonwww.info/BlogEngine/post/2012/06/23/how-to-produce-and-use-shdocvw-and-axshdocvw.aspx -
> それは .NET Framework の WebBrowser を拡張して操作するのではなく、COM の web
browser control (ShDocVw.dll) のラッパーを作ってそれを操作するということになる
のではありませんか?ならないです。IWebBrowser2 を new すると新しく CCW 経由で CoClass がインスタンス化されますが、前の投稿に記載しているようにインターフェース型をインターフェース型として利用している範囲では既存のインスタンスに対してアクセスするのみで、新たに CCW 経由の何かがインスタンス化されるようなことはありません。
単純に COM インターフェースの定義が欲しいためだけに SHDOCVW.DLL を取り込むのはちょっと大げさですけど、インターフェースの定義をする一番簡単な方法だろうと思います。
-
K. Takaoka様、アドバイス有難うございます。
using System.Reflection;
using System.Globalization;
this.webBrowser1.ActiveXInstance.GetType()
.InvokeMember(
"Offline", BindingFlags.SetProperty, null,
this.webBrowser1.ActiveXInstance, new object[] { true }, new CultureInfo(0x409));
webBrowser1.Offline = true;
SHDOCVW.DLL を参照設定し、このように追加しましたが、Offline は何を using すれば良いのでしょうか?
- 編集済み 村尾DOS 2012年11月4日 4:56
-
> 既存のインスタンスに対してアクセスするのみで
そのようですね。既存のインスタンスにアクセスできないと思っていましたが間違いでした。
試してみましたが、参照設定をすると COM の web browser control (shdocvw.dll) のラッパーが作られ、typeof(SHDocVw.IWebBrowser2) とするとラッパーで定義されている IWebBrowser2 の Type を取得してくるようですが、それを以下のように使って webBrowser1.ActiveXInstance を操作可能なようです。
typeof(SHDocVw.IWebBrowser2).InvokeMember( "Offline", System.Reflection.BindingFlags.SetProperty, null, this.webBrowser1.ActiveXInstance, new object[] { true }, new System.Globalization.CultureInfo(0x409));
でも、どうも正攻法ではなさそうな気がして、個人的にこれを使うのは抵抗があります。
typeof(SHDocVw.IWebBrowser2) に代えて webBrowser1.ActiveXInstance.GetType() を使っても可能のようですが、ActiveXInstance が "この API は、.NET Framework インフラストラクチャをサポートします。独自に作成したコードから直接使用するためのものではありません。" ということなので、こちらも抵抗があります。
そのあたりはどうなのでしょう?
-
こんにちは、cbqb22と申します。
すでにいくつかご回答があるようなので、口を挟むのもどうかと思いましたが、少しだけ議題に触れさせて頂きます・・・。
オフライン中にキャッシュから現ページを表示したいとのことですが、そこでのユーザー操作でどの様なものを想定されておりますか?
それらの操作によっていくつか対応も変わってくるかと思います。(あくまで予想ですが)
まずただ単に静的ページの表示であれば、あらかじめローカルにファイルとしてキャッシュしてそちらへ全リンクを張り替えてしまえばいいのではと思います。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=43473&forum=7
一方で、以下の作業の様な場合は現状では簡単にはいかないかと考えます。
①オフ→オンライン復帰時に現在作業したデータコミットを行いたい場合
②オフ時でも表示されているリンク先へナビゲーションを行いたい場合
理由:タイムアウト対応、リンク先の動的ページのキャッシュ処理が発生する為。キャッシュファイルの場所がブラウザによって異なったりなど。
質問の『オフライン状態にするには』から少々脱線気味で、的を得てない気がしますので、スルーして頂いても結構です。
参考になれば・・。