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

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

  • 2007-09-24 (月) 22:22
  • C#

最近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)で既定ブラウザを起動。

以上

Comments:1

Ohagi3rd@Yahoo 13-06-12 (水) 3:47

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

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://red-treasure.com/report/wp-trackback.php?p=100
Listed below are links to weblogs that reference
C#トリビアルメモ2 (Webbrowserのリンクをクリックしたら既定のブラウザで開くようにする) from コスミー報告書[社外秘]

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

Search
Feeds
Meta
 合計:016020
 今日:0018 昨日:0168

Return to page top