« Small Basic v0.91 ~ 対応言語追加のみ | トップページ | 無償で使える F# の環境を作ってみよう »

2010年12月 4日 (土)

う~む… .NET Framework 4 になっても、 IE を操作するのはめんどくさいままなのか!

C# と .NET Framework の世界はどんどん楽になるので、 Windows 上での開発はみんなそうだと思っていると… WebBrowser コンポーネントの扱いはそうでもなかったらしい orz

WebBrowser コンポーネント (つまり、 IE  の心臓部を COM で包んだ ActiveX コンポーネント) を貼りつけたクライアント プログラムを久々に書こうと思って調べたんだけど。
イベントを取るには、 .NET Framework 4 になっても、 あいかわらず昔と同じやり方しかないみたい。
めんどくさいんだな、 これが。 f(^^;

20101204_contextmenuevent01

WPF で、 やってみた。

まずは、 イベント発生時に COM コンポーネントから呼び出してもらうためのクラスと、 それに渡すデリゲートの定義を用意します。

public delegate void HTMLDocumentEvent(mshtml.IHTMLEventObj e);

[System.Runtime.InteropServices.ComVisible(true)]
public class HTMLDocumentEventHandler
{
    public HTMLDocumentEvent Handler;
    private mshtml.HTMLDocument document;

    public HTMLDocumentEventHandler(mshtml.HTMLDocument doc)
    {
        this.document = doc;
    }

    [System.Runtime.InteropServices.DispId(0)]
    public void Call()
    {
        Handler(document.parentWindow.@event);
    }
}

そうしたら、 WebBrowser コンポーネントの LoadCompleted イベント (これはマネージドな世界のイベント) の中で、 上記のハンドラークラスを介して、 イベントハンドラーのデリゲートをくっつけてやります。

// LoadCompleted イベントハンドラーの中

mshtml.HTMLDocument doc = this.webBrowser1.Document as mshtml.HTMLDocument;
if (doc == null)
    return;

mshtml.DispHTMLDocument disp = doc as mshtml.DispHTMLDocument;
if (disp == null)
    return;

HTMLDocumentEventHandler handler = new HTMLDocumentEventHandler(doc);
handler.Handler += new HTMLDocumentEvent(this.OnHTMLDocumentEvent);
disp.oncontextmenu = handler; //コンテキストメニューのイベントにセット

あ。 mshtml を使うには、 Microsoft.mshtml.dll への参照設定が必要です。

渡したデリゲートのネタ、 OnHTMLDocumentEvent メソッドは、 次のような感じで。

private void OnHTMLDocumentEvent(mshtml.IHTMLEventObj e)
{
    StringBuilder sb = new StringBuilder();
    sb.AppendFormat("イベントタイプ: {0}\n", e.type);

    mshtml.IHTMLElement src = e.srcElement as mshtml.IHTMLElement;
    if(src != null)
        sb.AppendFormat("イベントソースのタグ: <{0}>\n\n", src.tagName);

    sb.AppendLine("続けて本来のコンテキストメニューを表示しますか?");
    MessageBoxResult result
        = MessageBox.Show(sb.ToString(),
            "WebBrowser オブジェクトのイベントをキャッチ",
            MessageBoxButton.YesNo, MessageBoxImage.Information, MessageBoxResult.No);

    e.returnValue = (result == MessageBoxResult.Yes);
    // false を渡せば、コンテキストメニューは出ない
}

|

« Small Basic v0.91 ~ 対応言語追加のみ | トップページ | 無償で使える F# の環境を作ってみよう »

プログラミング」カテゴリの記事

* プログラミング ( WPF )」カテゴリの記事

コメント

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: う~む… .NET Framework 4 になっても、 IE を操作するのはめんどくさいままなのか!:

« Small Basic v0.91 ~ 対応言語追加のみ | トップページ | 無償で使える F# の環境を作ってみよう »