最近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#2010(.NET4.0)ではクリックした位置が
e.MousePositionではダメなようでした。e.ClientMousePositionで正しく動きました。
ご報告まで。