DOBON.NET DOBON.NETプログラミング掲示板過去ログ

WebBrowserでの文字列検索

環境/言語:[Windows2000SP4, C#, .NET Framework1.1]
分類:[.NET]

Windows2000SP4, C#, .NET Framework1.1

今回自分で調査してもどうしてもわからない事があり
こちらに投稿させていただきます。

MS-Word-XPにて作成した文書を「〜.mht」という形式に変換したものを
WebBrowserを使用して表示させる処理を作成しています。

ドキュメントを表示する所まではできましたが、
この表示されているドキュメントから「任意に指定された文字列を検索する」という
処理で行き詰まっています。
通常IEなどで「Ctrl+F」で表示される検索機能のようなものと考えて下さい。

【条件】
・システムの関係で実機ではキーボード無しで
 マウスのみの操作となります。
・Windowが2つあり、検索対象文字列を表示しているWindow1と
 WebBrowserでドキュメントを表示しているWindow2とあります。


【実現したい機能】
・Window1のTextBoxに表示されている文字列を、
 Window2内の「検索」ボタンで検索する。
 Window2内の「前」「後」ボタンで前後の候補を検索する。

・上記の機能が無理であればWindow内の「検索」ボタンをクリックする事で
 WebBrowser上で「Ctrl+F」で表示される検索ダイアログを表示する。
・検索ダイアログにWindow1のTextBoxに表示されている文字列を設定する。


自分の調査不足かもしれませんが、ご教授のほどよろしくお願いします。
> 【実現したい機能】
> ・Window1のTextBoxに表示されている文字列を、
>  Window2内の「検索」ボタンで検索する。
>  Window2内の「前」「後」ボタンで前後の候補を検索する。

ブラウザコントロールの Document オブジェクトは IHTMLDocument2 インターフェースを実装しているので、そこから HTML 文書をプログラム的に読み取って、検索することはできるはずです。

が、結構面倒でしょうね。
検索語がタグで分断されている場合なんかもあるはずなので。

それに、検索を実行したら HTML 文書中の検索語を選択状態にしたりしたいですよね?
これも、やってできないことはないと思いますが、結構手間はかかると思います。

> ・上記の機能が無理であればWindow内の「検索」ボタンをクリックする事で
>  WebBrowser上で「Ctrl+F」で表示される検索ダイアログを表示する。

は IWebBrowser2::ExecWB(OLECMDID_FIND) すればできそうな気がします。

> ・検索ダイアログにWindow1のTextBoxに表示されている文字列を設定する。

は、Windows API をいくつか組み合わせないと無理ぽいです。

・検索ダイアログを FindWindow() する。
・検索ダイアログのエディットコントロールを GetDlgItem() する。
・検索ダイアログのエディットコントロールに、SendMessage(WM_SETTEXT) する。

みたいな流れでできるんじゃないでしょうか。
返信ありがとうございます。

「HTML 文書をプログラム的に読み取って〜」という方法は初心者の私には難しそうなので
ExecWBを使用する事にしたのですが、
ここでまた躓いてしまいました。

m_WebBrowser.ExecWB(SHDocVw.OLECMDID.OLECMDID_FIND,
          SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_PROMPTUSER);
とやってみたのですが、
「呼び出しのターゲットが例外をスローしました」というエクセプションが発生して、
(通常の)エクスプローラーのファイル検索画面が表示されてしまいました。

試しにOLECMDIDをOLECMDID_SELECTALLやOLECMDID_PRINTPREVIEWにした所
正常に動作しました。
また、それらしい名前という事で「OLECMDID_SHOWFIND」を指定したら
同様の例外が発生してしまいました。

重ねての質問、申し訳ありませんがお願いいたします。
> m_WebBrowser.ExecWB(SHDocVw.OLECMDID.OLECMDID_FIND,
>           SHDocVw.OLECMDEXECOPT.OLECMDEXECOPT_PROMPTUSER);
> とやってみたのですが、
> 「呼び出しのターゲットが例外をスローしました」というエクセプションが発生して、
> (通常の)エクスプローラーのファイル検索画面が表示されてしまいました。

HTML 文書を表示させている状態で、そうなってしまいますか?

もしそうだとすると、IWebBrowser2::ToolBar() などと同じように、ブラウザコントロールでは利用できないってことですね。。。

この方法が駄目だとすると、

> 「HTML 文書をプログラム的に読み取って〜」という方法は初心者の私には難しそうなので
> ExecWBを使用する事にしたのですが、

しか道は無いです。
> HTML 文書を表示させている状態で、そうなってしまいますか?
>
> もしそうだとすると、IWebBrowser2::ToolBar() などと同じように、ブラウザコントロールでは利用できないってことですね。。。
>
> この方法が駄目だとすると、
> :(省略)
> しか道は無いです。

残念ですがそちらの方法でがんばってみます。
ご教授ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板