C#webBrowser HTMLDoc.Click多次触发,为什么?

时间:2010-11-17 19:35:53

标签: c# .net-4.0 webbrowser-control dom

我有下面的代码但是当我点击网页时它会触发2到6次。怎么才能让它一下子开火?

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
   if (webBrowser1.Document != null)
   {
      htmlDoc = webBrowser1.Document;
      htmlDoc.Click += htmlDoc_Click;
      //htmlDoc.MouseDown += htmlDoc_MouseDown;
      //htmlDoc.MouseMove += htmlDoc_MouseMove;
      htmlDoc.ContextMenuShowing += htmlDoc_ContextMenuShowing;
   }
}

void htmlDoc_Click(object sender, HtmlElementEventArgs e)
{
   Console.WriteLine("Mouse Click");
   if (e.CtrlKeyPressed)
   {
      if (webBrowser1.Document.GetElementFromPoint(e.ClientMousePosition).InnerHtml != null)
      {
        //MessageBox.Show(webBrowser1.Document.GetElementFromPoint(webBrowser1.PointToClient(MousePosition)).InnerText.ToString());
        Debug.WriteLine(webBrowser1.Document.GetElementFromPoint(e.ClientMousePosition).InnerHtml);
      }

      e.ReturnValue = false;
      return;
   }

   // stop mouse events moving on to the HTML doc return false
   e.ReturnValue = true;
}

2 个答案:

答案 0 :(得分:3)

如果您访问的网页包含框架,则DocumentCompleted事件将多次触发,每帧一次。因此,您将多次订阅该活动。通过检查e.Url.Equals(webBrowser1.Url)来过滤它,它只适用于最后一个。

您需要解决的另一个问题是取消订阅该事件,此时您将泄漏HtmlDocument。在调用Navigate()之前一定要取消订阅。

答案 1 :(得分:0)

您需要实现自己的Dispose方法并在所有事件中取消订阅:

            htmlDoc.Click -= htmlDoc_Click;

            htmlDoc.ContextMenuShowing -= htmlDoc_ContextMenuShowing;

像你的变量这样的Loos是全局的,所以不应该是一个问题。