2009-07-07 16 views
5

इससे पहले कि मैं बंद और इस कोड को जाना है, मैंने सोचा था कि यहाँ किसी को भी किसी भी खुला स्रोत का पता (या के लिए भुगतान किया) पहले से ही निर्मित समकक्ष अगर मैं देखना चाहते हैं।सी # वेब ब्राउज़र और उजागर

मैं एक ब्राउज़र नियंत्रण जहाँ उपयोगकर्ताओं को एक वेब पेज पूर्वावलोकन कर सकते हैं और फिर इसे के तत्वों पर प्रकाश डाला और एक बार प्रकाश डाला, मैं div या चयनित तत्व की आईडी प्राप्त कर सकते हैं के लिए देख रहा हूँ।

क्या किसी ने ऐसी चीज देखी है?

उत्तर

9

यहां .NET WebBrowser नियंत्रण का उपयोग करके एक क्रूड संस्करण है, जो इंटरनेट एक्सप्लोरर का उपयोग करता है।

namespace WindowsFormsApplication1 
{ 
    using System; 
    using System.Collections.Generic; 
    using System.Diagnostics; 
    using System.Windows.Forms; 

    public partial class Form1 : System.Windows.Forms.Form 
    { 
     private HtmlDocument document; 

     private IDictionary<HtmlElement, string> elementStyles = new Dictionary<HtmlElement, string>(); 

     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
     { 
      this.Text = e.Url.ToString(); 
      this.document = this.webBrowser1.Document; 
      this.document.MouseOver += new HtmlElementEventHandler(document_MouseOver); 
      this.document.MouseLeave += new HtmlElementEventHandler(document_MouseLeave); 
     } 

     private void document_MouseLeave(object sender, HtmlElementEventArgs e) 
     { 
      HtmlElement element = e.FromElement; 
      if (this.elementStyles.ContainsKey(element)) 
      { 
       string style = this.elementStyles[element]; 
       this.elementStyles.Remove(element); 
       element.Style = style; 
      } 
     } 

     private void document_MouseOver(object sender, HtmlElementEventArgs e) 
     { 
      HtmlElement element = e.ToElement; 
      if (!this.elementStyles.ContainsKey(element)) 
      { 
       string style = element.Style; 
       this.elementStyles.Add(element, style); 
       element.Style = style + "; background-color: #ffc;"; 
       this.Text = element.Id ?? "(no id)"; 
      } 
     } 
    } 
} 
+0

क्या 'this' ऑपरेटर WebBrowser1_DocumentCompleted विधि में उल्लेख करने के लिए करता है? –

3

मुझे इसी तरह की आवश्यकता थी और मूल रूप से पोस्ट किया गया कोड एक जबरदस्त मदद थी। मैं मूल लेखक की दयालुता वापस करना चाहता हूं।

प्रदान किया गया उत्तर अपर्याप्त है। यह केवल अनुरोध के पहले भाग का जवाब देता है: प्रस्तुत एचटीएमएल को हाइलाइट करना। यह अनुरोध के दूसरे भाग को हल नहीं करता है जहां सी # प्रोग्राम बता सकता है कि कौन सा नोड चुना गया है।

माउस रूप में प्रवेश करती है और वांछित गाया क्षेत्र की ओर ले जाता है के रूप में, मुख्य आकर्षण माउस का पालन करेंगे। इसका मतलब है कि माउस द्वारा संभावित रूप से कई HTML तत्वों का दौरा किया जाएगा।

तो सी # कैसे बता सकता है कि उपयोगकर्ता कौन सा तत्व चाहता है?

कार्यक्रम को उपयोगकर्ता को वांछित प्रस्तुत क्षेत्र पर क्लिक करने की अनुमति देना है। क्लिक सी # कार्यक्रम द्वारा फंस जाना चाहिए। इसके अतिरिक्त, सी # को तत्व पर दिए गए क्लिक को अक्षम करना चाहिए (उदाहरण के लिए, यदि यह एक एंकर तत्व है जिसे आप लिंक का पालन करने के लिए क्लिक नहीं करना चाहते हैं)।

(1) 'दस्तावेज़ पूरा' घटना मैं दस्तावेज़ स्तर पर क्लिक करें घटना के लिए एक जाल (केवल दस्तावेज़ के लिए एक बार) जोड़ा पर::

मैं इस प्रकार के रूप में मेरे कार्यक्रम में इस हल

 HtmlDocument htmlDoc = webBrowser.Document; 

     _document = webBrowser.Document; 

     //-- add our handler only once 
     if (!_documentHandlers.Contains(_document)) 
     { 
      _document.MouseOver += new HtmlElementEventHandler(document_MouseOver); 
      _document.MouseLeave += new HtmlElementEventHandler(document_MouseLeave); 

      mshtml.HTMLDocumentEvents2_Event iEvent; 
      IHTMLDocument2 currentDoc = (IHTMLDocument2) webBrowser.Document.DomDocument; 

      iEvent = (mshtml.HTMLDocumentEvents2_Event) currentDoc; 
      iEvent.onclick += new mshtml.HTMLDocumentEvents2_onclickEventHandler(clickDocumentHandler); 

      _documentHandlers.Add(_document); 
     } 

'दस्तावेज़ पूरा' घटना एक ही दस्तावेज़ (CNN.com कोशिश) के लिए कई बार शुरू किया जा सकता। '_documentHandlers' वैरिएबल यह सुनिश्चित करने के लिए हैशसेट है कि हम केवल एक दिए गए दस्तावेज़ के अनुसार हैंडलर को एक बार जोड़ते हैं।

(2) मैंने तत्व स्तर पर क्लिक को फंसाने का भी चयन किया। 'पर माउस' पर मैं कहा:

   mshtml.HTMLElementEvents2_Event iEvent; 
       iEvent = element.DomElement as mshtml.HTMLElementEvents2_Event; 
       if (iEvent == null) 
        return; 
       iEvent.onclick += new mshtml.HTMLElementEvents2_onclickEventHandler(clickElementHandler); 

और 'माउस छुट्टी' पर मैं क्लिक हैंडलर अपंजीकृत:

   mshtml.HTMLElementEvents2_Event iEvent; 
       iEvent = element.DomElement as mshtml.HTMLElementEvents2_Event; 
       if (iEvent == null) 
        return; 
       iEvent.onclick -= new mshtml.HTMLElementEvents2_onclickEventHandler(clickElementHandler); 

(3) क्लिक संचालकों सरल हैं:

private bool clickDocumentHandler(IHTMLEventObj pEvtObj) 
    { 
     IHTMLElement element = (mshtml.IHTMLElement)pEvtObj.srcElement; 

     pEvtObj.cancelBubble = true; 
     pEvtObj.returnValue = false; 

     return false; 
    } 

    private bool clickElementHandler(IHTMLEventObj pEvtObj) 
    { 
     IHTMLElement element = (mshtml.IHTMLElement)pEvtObj.srcElement; 

     pEvtObj.cancelBubble = true; 
     pEvtObj.returnValue = false; 

     return false; 
    } 

ध्यान दें कि वे घटना के बुलबुले को रद्द कर देते हैं और क्लिक को ऊपर से गिरने से रोकने के लिए 'झूठी' का मूल्य वापस कर देते हैं।

इन संचालकों में आप तत्व क्लिक किया जा रहा बचाने के लिए और फिर अपने आवेदन में कहीं और इसका इस्तेमाल करने के अपने विशिष्ट कोड जोड़ सकते हैं।

ध्यान दें कि तत्व के स्तर पर, नहीं हर IHTMLElement एक onclick हैंडलर इसलिए अशक्त के लिए चेक का समर्थन करता है।

-Enjoy डेविड

+1

_Document और _documentHandlers को परिभाषित किए जाने पर यह कोड अधिक उपयोगी होगा। –

संबंधित मुद्दे