2009-06-10 2 views
5

Я использую управление System.Windows.Forms.WebBrowser, и мне нужно делать программную прокрутку.Прокрутка 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 на библиотеку объектов Microsoft HTML (mshtml).

Предполагая, что у вас есть WebBrowser с именем 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() .InvokeMember ("scrollTop", BindingFlags.SetProperty, null, doc, новый объект [] {500}); –

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

это простой способ для перехода к каждой точке просто ввести свой

+0

ничего не происходит, страница не прокручивается – dialex

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