2010-11-17 119 views
1

我有下面的代码,但是当我点击网页时,它会触发2-6次。我怎么才能让它只发一次?C#webBrowser HTMLDoc.Click触发多次,为什么?

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; 
} 
+0

每次文档加载时,您都会意识到您将注册点击事件......因此可能会创建您正在描述的内容。 – 2010-11-17 19:41:10

+0

是你的页面被加载到WebBrowser控件坐在窗体上? – dexter 2010-11-17 19:42:34

+0

@ Max是的。 @Aaron谢谢我认为你是正确的,但我不知道如何使它只在最后一个documentComplete上添加事件处理程序? – Adrian 2010-11-17 19:52:50

回答

3

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

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

0

你需要实现自己的Dispose方法,并从所有事件退订有:

  htmlDoc.Click -= htmlDoc_Click; 

      htmlDoc.ContextMenuShowing -= htmlDoc_ContextMenuShowing; 

卢斯像你的变量是全局所以不应该是一个问题。

相关问题