2010-11-17 3 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

Вы понимаете, что каждый раз, когда документ загружается, вы регистрируетесь для события click ... таким образом, потенциально создавая то, что вы описываете. –

+0

Ваша страница загружается в элемент управления WebBrowser, сидя на форме? – dexter

+0

@ Max да. @ Аарон спасибо, я думаю, вы правы, но я не уверен, как это сделать, только добавление обработчика событий на последнем documentComplete? – Adrian

ответ

3

Если веб-страница, которую вы посещаете, содержит фреймы, событие DocumentCompleted будет срабатывать несколько раз, один раз для каждого кадра. И, таким образом, вы будете подписывать событие несколько раз. Отфильтруйте это, проверив e.Url.Equals (webBrowser1.Url), это верно только для последнего.

Другая проблема, которую вам придется решить, - это отменить подписку на событие, прямо сейчас вы будете утечка HtmlDocument. Обязательно отмените подписку перед вызовом Navigate().

0

Вы должны реализовать свой собственный метод Dispose и отписываться там от всех событий:

  htmlDoc.Click -= htmlDoc_Click; 

      htmlDoc.ContextMenuShowing -= htmlDoc_ContextMenuShowing; 

Лоос, как ваши переменные являются глобальными, так не должно быть проблемой.

Смежные вопросы