う~む… .NET Framework 4 になっても、 IE を操作するのはめんどくさいままなのか!
まずは、 イベント発生時に 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 を渡せば、コンテキストメニューは出ない
}
| 固定リンク
「プログラミング」カテゴリの記事
- 【.NET / Win8.1 ストアアプリ】 HttpClient で TLS 1.1 / 1.2 に対応するには(2018.06.17)
- 【VS2017 15.7pv2】 XAML のランタイム ツールに 「ヒートマップ」 が増えた(2018.03.28)
- 【.NET Core】 プロジェクトを作ると 「project.assets.json が見つかりません」 エラー(2018.02.10)
- 【#UWP】 ビットマップの表示色を変える (Win2D.uwp 経由で Direct2D を使う)(2017.08.23)
- 【#UWP】 CompactOverlay モード: Picture in Picture というか、「最前面に表示」するウィンドウを作る(2017.08.16)
「* プログラミング ( WPF )」カテゴリの記事
- 【VS2017 15.7pv2】 XAML のランタイム ツールに 「ヒートマップ」 が増えた(2018.03.28)
- [VS2010] (続) オプション 「生成されたコードから結果を表示しない」 の挙動不審(2011.08.24)
- う~む… .NET Framework 4 になっても、 IE を操作するのはめんどくさいままなのか!(2010.12.04)
- MSDN マガジン、読んでますか!?(2010.05.27)
- [WPF] 盾アイコン付きのボタンを作る (続)(2010.02.20)
この記事へのコメントは終了しました。
コメント