激凹みから立ち直る方法

こんにちわ。
私は今、axWebBrowserを使用して
インターネットブラウザを作っています。
インターネットエクスプローラーをモデルにして
エンコードの変更を実装したいのですが、
期待通りに動かすにはどうれば良いか解らないので質問させて頂きます。
開発環境
OS : windowsXP
環境 : Microsoft Visual Studio 2008
言語 : C#

やりたい事
コンボボックスに格納したEncodingクラスの中からエンコードを選択するとaxWebBrowserに表示されている文字列を
指定されたエンコードで再読み込みする。
動作のモデルは、インターネットエクスプローラーで
表示→エンコード→エンコードのリストの中からクリック
をした時の動作です。

現在、どの様なコーディングをしていて何故できないのか?
現状の処理の流れを説明します。
エンコードを格納したコンボボックスに
SelectedIndexChanged関数を作成し、
System.Net.WebClientで新しくhtmlを読み込んで
Documentに読み込ませています。
以下にソースコードを書きます
private void comboBox2_SelectedIndexChanged(object sender, EventArgs e)
{
// 選択したインデックスが0に満たない場合はリターン
if (0 > comboBox2.SelectedIndex)
{
 return;
}

 // htmlを指定したエンコードで取得
 System.Net.WebClient wc = new System.Net.WebClient();
// axWebBrowser1が現在表示しているurlを読み込む
 System.IO.Stream st = wc.OpenRead(((mshtml.HTMLDocumentClass)axWebBrowser1.Document).url);
// エンコードの決定
 Encoding enc = (Encoding)comboBox2.SelectedItem;
 // 指定したエンコードで読み込む
 System.IO.StreamReader sr = new System.IO.StreamReader(st, enc);
 // HTML取得
 string html = sr.ReadToEnd();
 // ストリームを閉じる
 sr.Close();
 st.Close();
// 取得したhtmlをaxWebBrowserに読み込ませる
 ((mshtml.HTMLDocumentClass)axWebBrowser1.Document).IHTMLDocument2_write(html);
}

このコーディングだと
htmlは読み込むのですが、
画像ファイル等のリンクが切れていて、
例えばgoogleのTOPページでインターネットエクスプローラーから
ソースを表示してソースをローカルPCにhtmlファイルとして保存して
そのhtmlファイルを読み込ませた時と同じ結果になっていまいます。
(webページとしてサーバーからの情報を読み込んでいないと言う表現で伝わるでしょうか?)
そしてエンコードをコンボボックスから2回以上変更しようとすると
2回目にaxWebBrowserのurlがabout:blankとなりwc.OpenRead関数で
例外処理が発生します。

どうすればインターネットエクスプローラーでエンコードを変更した時の様に
webページとして読み込んで
エンコードが違う場合は文字化けし
適切なエンコードを選択すると文字化けが解消される
といった動作を行わせることが出来るでしょうか?

A 回答 (1件)

うまく回答に纏められないのでメモ殴り書き:



axWebbrowserでなきゃだめなのか?
System.Windows.Forms.WebBrowser
はどうか?(MS謹製の.NET Frameworkは内部でaxWebbrowser利用しているらしいけど)

#Windows依存であるSystem.Windows.Forms名前空間にどっぷり浸かっても良いものか?俺はたとえいくつかの実装がMicrosoft.VisualBasic名前空間をサポートしたとしてもできるだけ使わないように努力している。Mono.WebKitとかにした方が無難?
#そういう信念上の話を抜きにするなら動作上は一応たしかMonoも別なコンポーネントを利用して実装しようとしていたはず。
http://www.mono-project.com/WebBrowser
#何か俺の環境だとMonoのライブラリ使ってコンパイルできないんですが。
#大元の質問の答えは調べてないけれど、ここを突破できるなら
=====================
http://msdn.microsoft.com/en-us/library/system.w …
http://msdn.microsoft.com/en-us/library/system.w …
あたりでどうにかなるはず。
以下、サンプルソース
======================
using System;

namespace Q5498456A

{

class Q5498456A:System.Windows.Forms.Form

{

private System.Windows.Forms.WebBrowser webbrowser1;

private System.Windows.Forms.ComboBox combobox1;

Q5498456A(){

this.Width = 800;

this.Height = 600;



webbrowser1 = new System.Windows.Forms.WebBrowser();

webbrowser1.Top = 0;

webbrowser1.Left = 0;

webbrowser1.Width = this.Width;

webbrowser1.Height = this.Height - 200;



combobox1 = new System.Windows.Forms.ComboBox();

combobox1.Items.Add(System.Text.Encoding.GetEncoding(932).WebName);

combobox1.Items.Add(System.Text.Encoding.UTF8.WebName);

combobox1.Top = this.Height - 200;

combobox1.Left = 0;

combobox1.Width = this.Width;

combobox1.SelectedIndex = 0;

combobox1.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;



combobox1.SelectedIndexChanged += combobox1_SelectedIndexChanged;



this.Controls.Add(combobox1);

this.Controls.Add(webbrowser1);





webbrowser1.Navigate("http://localhost/OKWave/Q5498456/aaa.html");



}



private void combobox1_SelectedIndexChanged(Object sender,System.EventArgs e){

/* むかつくことにこのプロパティ、System.Text.EncodingじゃなくてStringなんです */

webbrowser1.Document.Encoding = (string)(((System.Windows.Forms.ComboBox)sender).SelectedItem);

webbrowser1.Refresh();

}

/* つけないとコンパイラが怒る。理由はわからん */

[STAThreadAttribute]

public static void Main(){

Q5498456A f1 = new Q5498456A();

f1.ShowDialog();

}



}

}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ご教授いただいた方法と違うのですが、実現できましたので、
解決した方法をこの場を借りて書き込みたいと思います。
取得したhtmlを
((mshtml.HTMLDocumentClass)axWebBrowser1.Document).IHTMLDocument2_write(html);
ではなく
((mshtml.HTMLDocument)axWebBrowser1.Document).body.innerHTML
プロパティに代入した所期待通りの動作をさせる事ができました。

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

お礼日時:2009/12/05 19:19

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