C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: WebBrowserのページ内検索の実装


(過去ログ 12 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■3359 / inTopicNo.1)  WebBrowserのページ内検索の実装
  
□投稿者/ さとみ (1回)-(2007/05/07(Mon) 20:18:47)

分類:[C# (Windows)] 

2007/05/09(Wed) 17:04:40 編集(投稿者)

C#2005を使ってブラウザを作っているのですが
ブラウザで表示しているページの中のキーワードを検索する処理を実装したいのですが
どのように行えばできるのか、アドバイスをお願いします。
Ctlr+Fで標準でページ内検索はあるのですが
その機能を独自でtextBoxのキーを検索してページを移動する処理を作りたいので
なんでもいいので情報を頂けないでしょうか。

今はブラウザでURLに入力されたページが表示されるところまでしか出来ていません。
よろしくお願いします。
引用返信 編集キー/
■3360 / inTopicNo.2)  Re[1]: WebBrowserのページ内検索の実装
□投稿者/ 未記入 (76回)-(2007/05/07(Mon) 20:47:30)
No3359 (さとみ さん) に返信
> C#2005を使ってブラウザを作っているのですが
> ブラウザで表示しているページの中のキーワードを検索する処理を実装したいのですが
> どのように行えばできるのか、アドバイスをお願いします。
> Ctlr+Fで標準でページ内検索はあるのですが
> その機能を独自でtextBoxのキーを検索してページを移動する処理を作りたいので
> なんでもいいので情報を頂けないでしょうか。
>
> 今はブラウザでURLに入力されたページが表示されるところまでしか出来ていません。
> よろしくお願いします。

クライアントスクリプトに頼るのが一般的かな。いや検索を独自に用意している時点で一般的ではないですが。(サイト内検索なら話は別)
引用返信 編集キー/
■3363 / inTopicNo.3)  Re[1]: WebBrowserのページ内検索の実装
□投稿者/ YAS (4回)-(2007/05/07(Mon) 21:37:47)
DOMを検索して,テキストをもつHtmlElementを列挙し,ループで比較すればよいのでは?
Html全体を検索するとコメントなどに一致してしまった場合の処理などが面倒だと思います。
引用返信 編集キー/
■3364 / inTopicNo.4)  Re[2]: WebBrowserのページ内検索の実装
□投稿者/ さとみ (3回)-(2007/05/07(Mon) 22:19:01)
2007/05/09(Wed) 17:05:06 編集(投稿者)

No3360 (未記入 さん) に返信
> ■No3359 (さとみ さん) に返信
>>C#2005を使ってブラウザを作っているのですが
>>ブラウザで表示しているページの中のキーワードを検索する処理を実装したいのですが
>>どのように行えばできるのか、アドバイスをお願いします。
>>Ctlr+Fで標準でページ内検索はあるのですが
>>その機能を独自でtextBoxのキーを検索してページを移動する処理を作りたいので
>>なんでもいいので情報を頂けないでしょうか。
>>
>>今はブラウザでURLに入力されたページが表示されるところまでしか出来ていません。
>>よろしくお願いします。
>
> クライアントスクリプトに頼るのが一般的かな。いや検索を独自に用意している時点で一般的ではないですが。(サイト内検索なら話は別)

クライアントスクリプトとはjavascriptをソースに埋め込んでページ内検索を実装するということですよね!(サイト内ではないです)
単純にIEにある検索機能と同様に
・検索キーが入力できて
・検索した文字が見つかったら選択して反転表示
・検索した文字が表示される表にスクロールを移動する
ということを検索ダイアログを表示しないで行いたいのですが
javascriptでなくwebBrowserのメソッドとかでできないでしょうか?
引用返信 編集キー/
■3365 / inTopicNo.5)  Re[2]: WebBrowserのページ内検索の実装
□投稿者/ さとみ (4回)-(2007/05/07(Mon) 22:25:03)
2007/05/09(Wed) 17:05:26 編集(投稿者)

No3363 (YAS さん) に返信
> DOMを検索して,テキストをもつHtmlElementを列挙し,ループで比較すればよいのでは?
> Html全体を検索するとコメントなどに一致してしまった場合の処理などが面倒だと思います。

ありがとうございます。説明不足で申し訳ございません。
検索するのはいいのですがGoogleツールバーにあるような感じで検索キーで見つかった
文字の場所を反転して表示してスクロールバーを移動できるようにしたいので
IEのページ内検索(Ctlr+F)と同様のことを行うようなwebBrowserのメソッドみたいなのが
あれば、それを使いたいのですが、ご存じないでしょうか?
引用返信 編集キー/
■3366 / inTopicNo.6)  Re[1]: WebBrowserのページ内検索の実装
□投稿者/ 魔界の仮面弁士 (269回)-(2007/05/07(Mon) 23:02:23)
No3359 (さとみ さん) に返信
> C#2005を使ってブラウザを作っているのですが
> ブラウザで表示しているページの中のキーワードを検索する処理を実装したいのですが

ActiveX 版 WebBrowser において、IHTMLTxtRange での検索処理を実装した事があります。
ただし C# ではなく、VB6 でしたけど。

http://yaplog.jp/orator/archive/9


System.Windows.Forms.WebBrowser の場合は、HTMLDocument.DomDocument を使えば、同様の実装が
できるでしょうけれど、COM の扱いがかえって繁雑になるかも知れませんので、IHTMLTxtRange を使わず、
webBrowser1.Document.All あたりを foreach して、自前で検索する方が良いかも知れません。
引用返信 編集キー/
■3368 / inTopicNo.7)  Re[3]: WebBrowserのページ内検索の実装
□投稿者/ 未記入 (78回)-(2007/05/08(Tue) 09:35:12)
No3364 (さとみ さん) に返信
> javascriptでなくwebBrowserのメソッドとかでできないでしょうか?

あ、System.Windows.Forms.WebBrowserコントロールのことでしたか。
さっきの発言は忘れてください。
引用返信 編集キー/
■3374 / inTopicNo.8)  Re[2]: WebBrowserのページ内検索の実装
□投稿者/ さとみ (5回)-(2007/05/08(Tue) 17:53:03)
2007/05/09(Wed) 17:04:21 編集(投稿者)

No3366 (魔界の仮面弁士 さん) に返信
> ■No3359 (さとみ さん) に返信
>>C#2005を使ってブラウザを作っているのですが
>>ブラウザで表示しているページの中のキーワードを検索する処理を実装したいのですが
>
> ActiveX 版 WebBrowser において、IHTMLTxtRange での検索処理を実装した事があります。
> ただし C# ではなく、VB6 でしたけど。
>
> http://yaplog.jp/orator/archive/9
ありがとうございます。↑参考サイトを拝見させて頂きました

なかなかシンプルでこのようなことを行いたいです。
同様の処理が実装できるのでしたらもう少し詳しく教えていただけないでしょうか
> System.Windows.Forms.WebBrowser の場合は、HTMLDocument.DomDocument を使えば、同様の実装が
> できるでしょうけれど、COM の扱いがかえって繁雑になるかも知れませんので、IHTMLTxtRange を使わず、
> webBrowser1.Document.All あたりを foreach して、自前で検索する方が良いかも知れません。
WebBrowserのオブジェクトを見たのですが
HTMLDocument.DomDocument というのはないですが
WebBrowser.Document.DomDocument
というのはありました。
これを使ってVB6で実装しているような色を変えたりカーソル位置を移動させるようなことは
できるのであればもう少しヒントをいただけないでしょうか?
よろしくお願いします。

引用返信 編集キー/
■3375 / inTopicNo.9)  Re[3]: WebBrowserのページ内検索の実装
□投稿者/ 魔界の仮面弁士 (270回)-(2007/05/08(Tue) 18:12:50)
No3374 (さとみ さん) に返信
> HTMLDocument.DomDocument というのはないですが
失礼しました。
HTMLDocument.DomDocument ではなく、
HtmlDocument.DomDocument の間違いです。

> WebBrowser.Document.DomDocument
WebBrowser.Document プロパティの戻り値は、HtmlDocument クラスということで。


> 同様の処理が実装できるのでしたらもう少し詳しく教えていただけないでしょうか
ActiveX 版の WebBrowser.Document プロパティが返すオブジェクトは、C#2005 で、
WebBrowser.Document.DomDocument プロパティが返すオブジェクトと同等です。
それを踏まえた上で、先の VB6 サンプルを眺めてみてください。


> できるのであればもう少しヒントをいただけないでしょうか?
ヘルプにある、HtmlDocument.DomDocument プロパティの使用例を参考にしてみてください。
そのためにはまず、COM の MSHTML タイプライブラリを参照設定した上で、
HtmlDocument.DomDocument プロパティから返されるオブジェクトを、
IHTMLDocument2 型の変数に入れてみれば、道が開けるかと思います。
引用返信 編集キー/
■3399 / inTopicNo.10)  Re[4]: WebBrowserのページ内検索の実装
□投稿者/ さとみ (7回)-(2007/05/09(Wed) 13:56:27)
2007/05/09(Wed) 17:03:43 編集(投稿者)

No3375 (魔界の仮面弁士 さん) に返信
> ■No3374 (さとみ さん) に返信
>>HTMLDocument.DomDocument というのはないですが
> 失礼しました。
> HTMLDocument.DomDocument ではなく、
> HtmlDocument.DomDocument の間違いです。
>
>>WebBrowser.Document.DomDocument
> WebBrowser.Document プロパティの戻り値は、HtmlDocument クラスということで。
>
>
>>同様の処理が実装できるのでしたらもう少し詳しく教えていただけないでしょうか
> ActiveX 版の WebBrowser.Document プロパティが返すオブジェクトは、C#2005 で、
> WebBrowser.Document.DomDocument プロパティが返すオブジェクトと同等です。
> それを踏まえた上で、先の VB6 サンプルを眺めてみてください。
>
>
>>できるのであればもう少しヒントをいただけないでしょうか?
> ヘルプにある、HtmlDocument.DomDocument プロパティの使用例を参考にしてみてください。
> そのためにはまず、COM の MSHTML タイプライブラリを参照設定した上で、
> HtmlDocument.DomDocument プロパティから返されるオブジェクトを、
> IHTMLDocument2 型の変数に入れてみれば、道が開けるかと思います。
色々調べてMSHTMLの参照設定を追加してIHTMLDocument2が使えるように
まで頑張ってできたのですが,VB6のソースを見ながらどうすれば良いのか
分からなくて困っているのでもう少しヒントもらえないでしょうか
よろしくお願いします。
引用返信 編集キー/
■3416 / inTopicNo.11)  Re[5]: WebBrowserのページ内検索の実装
□投稿者/ さとみ (8回)-(2007/05/09(Wed) 23:15:07)
No3399 (さとみ さん) に返信
なんとか無事に検索処理ができました。
魔界の仮面弁士さんありがとうございました。
意味のあるスレッドになるように情報を残しておきます。

・C#にMSHTMLの参照設定の方法
「MSDN Home > MSDN アカデミック アライアンス > 第 2 回 VC# で MSHTML」
で解説されています。
http://www.microsoft.com/japan/msdn/academic/Articles/fun/02/
・組み込んだMSHTMLとIHTMLDocument2の使い方
http://pedroluismateo.blogspot.com/2007/01/c-net-seleccionar-texto-dentro-de-un.html
・文字列検索、文字列の選択、背景の色替え(ハイライト)
下記の関数(メソッド)を利用詳細はurlをご覧下さい。
createTextRange
scrollIntoView
select
execCommand
collapse
findText
http://tomizawa-web.hp.infoseek.co.jp/method.htm
・サンプル(ハイライト処理)
mshtml.IHTMLDocument2 doc = webBrowser1.Document.DomDocument as mshtml.IHTMLDocument2;
mshtml.IHTMLBodyElement body = doc.body as mshtml.IHTMLBodyElement;
mshtml.IHTMLTxtRange objRange;
String BMK = "";
bool ret;
objRange = body.createTextRange();
while (true)
{
  //文字列検索
ret = objRange.findText(textBox1.Text, 1, 0);
if ( ret == false)
{
    //見つからなかった(ハイライト処理終了)
break;
}
  //見つかった文字列の部分の背景の色を黄色に変更
objRange.execCommand("BackColor", false, "YELLOW");
//次の検索開始位置を後方にづらす。
objRange.collapse(false);
}
・サンプル(検索文字選択処理)
//mshtml.IHTMLDocument2 doc = webBrowser1.Document.DomDocument as mshtml.IHTMLDocument2;
//mshtml.IHTMLBodyElement body = doc.body as mshtml.IHTMLBodyElement;
//mshtml.IHTMLTxtRange objRange;
String BMK = "";
bool ret;
int cnt =0;
//グローバルに保存しておく(ページ読込み完了時に行う)
//objRange = body.createTextRange();

//キーワードを順番に検索して次、次と順にキーワードを
//選択していくようにする処理のループ
while (true)
{
//文字列検索
ret = objRange.findText(textBox1.Text, 1, 0);
if (ret == false)
{
//見つからない時検索終了
flag_key = 0;
//オブジェクト初期化
objRange = body.createTextRange();
break;
}
//指定した位置のキーワードの時選択して反転表示にする
if (flag_key == cnt)
{
//検索で見つかった文字列を選択して反転表示する
objRange.select();
//スクロールバーの位置を選択している文字列に移動
objRange.scrollIntoView(false);
//次のキー選択用にキー選択用フラグを次の位置に設定
flag_key = cnt + 1;
//オブジェクト初期化
objRange = body.createTextRange();
//ループを抜ける
break;
}
//指定のキーワードのになるまでインクリメント
cnt++;
//検索位置を後方にづらす
objRange.collapse(false);
}
・最後に問題?(ハイライトしたの背景を元に戻す処理
調査中
URLを再度読み直せばできるけどスマートでないので・・・
objRange.queryCommandValue("BackColor");
で背景の色をとって最初に保存しておけばできると思うが
objRange.queryCommandValue("BackColor");
の戻り値の使い方がまだ理解できていない。

以上

解決済み
引用返信 編集キー/
■3418 / inTopicNo.12)  Re[6]: WebBrowserのページ内検索の実装
□投稿者/ 魔界の仮面弁士 (272回)-(2007/05/09(Wed) 23:35:39)
No3416 (さとみ さん) に返信
> ・最後に問題?(ハイライトしたの背景を元に戻す処理
execCommand("BackColor", false, "YELLOW") は、選択範囲に『<FONT style="BACKGROUND-COLOR: yellow">』のタグを付ける
コマンドなので、生成された font 要素の style.backgroundColor をクリアすれば、元に戻るかも。(試していませんが)
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -