2009-06-10 16 views
5

काम नहीं करता है मैं System.Windows.Forms.WebBrowser नियंत्रण का उपयोग कर रहा हूं और मुझे प्रोग्रामेटिकल स्क्रॉलिंग करने की आवश्यकता है।स्क्रॉलिंग वेबब्राउज़र प्रोग्रामिक रूप से कभी-कभी

WebBrowser.Document.Body.ScrollTop += WebBrowser.Height 

समस्या यह है कि कुछ साइटों में यह काम करता है, लेकिन दूसरों में यह

http://news.google.com (works good) 
http://stackoverflow.com/ (doesn't work) 

इसके बारे में कुछ हो सकता है नहीं करता है:

उदाहरण के लिए, मैं नीचे स्क्रॉल करने के लिए इस कोड का उपयोग शरीर कोड, लेकिन मैं समझ नहीं सकता।
मैं भी कोशिश की है:

WebBrowser.Document.Window.ScrollTo(0, 50) 

लेकिन इस तरह से मैं वर्तमान स्थिति पता नहीं है।

+0

आप शायद पहले दस्तावेज़ पूरी तरह से लोड किया गया है स्क्रॉल करने के लिए कोशिश कर रहे हैं? –

+0

नहीं, दस्तावेज़ पूरी तरह से लोड किया गया है – InfoStatus

उत्तर

4

यह उदाहरण स्क्रॉल बार गुणों में क्विर्क के आसपास काम करता है जो आपके द्वारा देखे जा रहे व्यवहार का कारण बन सकता है।

इससे पहले कि आप काम करेंगे इससे पहले आपको माइक्रोसॉफ्ट एचटीएमएल ऑब्जेक्ट लाइब्रेरी (एमएसटीएमएल) में एक COM संदर्भ जोड़ना होगा।

मान लें कि आपके पास WebBrowser1 नामक वेब ब्राउजर है, तो आप निम्न का प्रयास कर सकते हैं। मैं दो अलग-अलग इंटरफेस का उपयोग करता हूं क्योंकि मुझे पता चला है कि स्क्रॉल गुणों के लिए लौटाए गए मान असंगत हैं।

  using mshtml; 

// ... snip ... 

      webBrowser1.Navigate("http://www.stackoverflow.com"); 
      while (webBrowser1.ReadyState != WebBrowserReadyState.Complete) 
      { 
       Application.DoEvents(); 
       System.Threading.Thread.Sleep(20); 
      } 
      Rectangle bounds = webBrowser1.Document.Body.ScrollRectangle; 
      IHTMLElement2 body = webBrowser1.Document.Body.DomElement as IHTMLElement2; 
      IHTMLElement2 doc = (webBrowser1.Document.DomDocument as IHTMLDocument3).documentElement as IHTMLElement2; 
      int scrollHeight = Math.Max(body.scrollHeight, bounds.Height); 
      int scrollWidth = Math.Max(body.scrollWidth, bounds.Width); 
      scrollHeight = Math.Max(body.scrollHeight, scrollHeight); 
      scrollWidth = Math.Max(body.scrollWidth, scrollWidth); 
      doc.scrollTop = 500; 
+0

ध्यान दें कि यदि आप स्क्रॉल किए जा सकने वाले बड़े मान पर doc.scrollTop सेट करते हैं, तो कुछ भी नहीं होगा। – jjxtra

+2

यह मेरे लिए काम करता है। आप प्रतिबिंब का उपयोग करके mshtml संदर्भित करने से बच सकते हैं: var dd = browser.Document.DomDocument; var doc = dd.GetType()। InvokeMember ("documentElement", BindingFlags.GetProperty, null, dd, null); doc.GetType() .वॉवमेम्बर ("स्क्रॉलटॉप", बाइंडिंगफ्लैग्स .etProperty, शून्य, दस्तावेज़, नई वस्तु [] {500}); –

4
webBrowser1.Document.Window.ScrollTo(new Point(50, 50)); 

इस हर बिंदु बस इनपुट करने के लिए स्क्रॉल करने के लिए एक आसान तरीका है अपने

+0

कुछ भी नहीं होता है, पृष्ठ स्क्रॉल नहीं किया गया है – dialex

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