C#トリビアルメモ2 (Webbrowserのリンクをクリックしたら既定のブラウザで開くようにする)

最近WordPressの管理画面がばぐってる。微妙にいじったからかな・・・。

そういうわけでタイトルの通りです。
要は、Webbrowser上でクリックされたリンク先URLをどうやってとるかという話です。
まずはWebbrowser.Documentにリスナーを登録します。Webbrowserそのものに登録してもだめ。


webBrowser1.Document.Click += new HtmlElementEventHandler(Document_Click);

リスナーの中身です。


void Document_Click(object sender, HtmlElementEventArgs e)
{
    HtmlElement clickedElement = webBrowser1.Document.GetElementFromPoint(e.MousePosition);
    string link = null;
    if (clickedElement.TagName == "a" || clickedElement.TagName == "A")
    {
        link = clickedElement.GetAttribute("href");
    }
    else if (clickedElement.Parent != null)
    {
        if (clickedElement.Parent.TagName == "a" || clickedElement.Parent.TagName == "A")
        {
            link = clickedElement.Parent.GetAttribute("href");
        }
    }

    if (link != null && link != "")
    {
        try
        {
            System.Diagnostics.Process.Start(link);
        }
        catch
        {
        }
    }
}

HtmlElementEventArgs にToElementとかFromElementありますが、今回の場合どうもnullみたいで、取れているのはxy座標だけ。
そういうわけでGetElementFromPoint()をつかってHtmlElementを取得します。
で、TagNameで要素を判断してるんですが、デバッガで見てみるとなぜか大文字になっていました。まあ、念のためどっちもみとく。
他にいい方法あるのかもしれませんが、まあ、しらんし。
imgタグをaタグで囲っているときとかもあると思うので、一応親要素までチェック。まじめにやるなら親がnullかなんかになるまでループで探索するのが良いと思われる。
晴れてhref属性が取れた暁にはProcess.Start(link)で既定ブラウザを起動。

以上

コスミー について

昔(?)はゲーム作ってました。 今もなんか作ろうとしています。
カテゴリー: C# パーマリンク

C#トリビアルメモ2 (Webbrowserのリンクをクリックしたら既定のブラウザで開くようにする) への1件のフィードバック

  1. Ohagi3rd@Yahoo のコメント:

    クリックした要素を取得する方法を探していたら、ここに辿り着き参考にさせていただきました。
    情報ありがとうございます。
    環境により正しく動くのかもしれませんが、C#2010(.NET4.0)ではクリックした位置が
    e.MousePositionではダメなようでした。e.ClientMousePositionで正しく動きました。
    ご報告まで。

コメントを残す

メールアドレスが公開されることはありません。