2010-08-18 2 views
7

Я используюВыполнение функции JavaScript в экземпляре Internet Explorer

SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer() 

для управления/автоматизации экземпляра Internet Explorer. На некоторых страницах я хотел бы запустить функцию JavaScript (init()). Это, кажется, лучший способ сделать это состоит в использовании InvokeScript метод HtmlDocument «s и я пытался следующий без везения:

void ie_DocumentComplete(object pDisp, ref object URL) 
{ 
    System.Windows.Forms.HtmlDocument doc = ie.Document; 
    doc.InvokeScript("init"); 
} 

Что не удается, потому что doc является недействительным. Я не могу получить System.Windows.Forms.HtmlDocument от ie.Document. Помимо рекомендаций, приведенных выше, я также пытался:

System.Windows.Forms.HtmlDocument doc2 = (System.Windows.Forms.HtmlDocument)ie.Document; 

и

System.Windows.Forms.HtmlDocument doc2 = ie.Document as System.Windows.Forms.HtmlDocument; 

Любые идеи о том, как я могу получить эту работу - или даже лучший способ для запуска сценариев на странице?

Спасибо!

EDIT:

Другой способ запуска функции JavaScript, кажется, быть:

SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer() 
mshtml.HTMLDocument doc = ie.Document; 
mshtml.IHTMLWindow2 win = doc.parentWindow as mshtml.IHTMLWindow2; 
win.execScript("init();", "javascript"); 

Но линия

mshtml.IHTMLWindow2 win = doc.parentWindow as mshtml.IHTMLWindow2; 

выдает ошибку, что это неверный бросок (InvalidCastException) - хотя IntelliSense (и MSDN) говорят, что doc.parentWindow - это IHTMLWindow2. Есть идеи? (Кроме того, я сделал уверен, что страница полностью загружена перед запуском этого кода)

ответ

6

Проблема была связана с резьбе - Я потратил так много времени с вопросами STA вы думаете, я бы узнать сейчас :).

Как бы то ни было, я нашел способ получить второй бит кода, который я опубликовал, работая и запуская функции javascript в окне IE! Вот код:

this.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() => 
       { 

         mshtml.HTMLDocument doc = ie.Document; 

         mshtml.IHTMLWindow2 win = doc.parentWindow as IHTMLWindow2; 
         win.execScript("init();", "javascript"); 


       })); 

Надеюсь, это поможет кому-то!

+0

Ваш ответ, скорее всего, поможет, если вы конкретно объясните, что вы сделали для решения проблемы с потоками. :-) – EricLaw

0

SHDocVw.InternetExplorer.Document имеет тип mshtmlHTMLDocumentClass, так что вам нужно ссылаться на Microsoft.mshtml

mshtml.HTMLDocumentClass doc = (mshtml.HTMLDocumentClass)ie.Document; 

И.Е. объект также должен перемещаться где-нибудь, чтобы документ имел значение. такие как

object test = new object(); 
ie.Navigate("c:\\tmp\\test1.html", ref test, ref test, ref test, ref test); 

Всего INIT:

SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer(); 
object test = new object(); 
ie.Navigate("c:\\tmp\\test1.html", ref test, ref test, ref test, ref test); 
mshtml.HTMLDocumentClass doc = (mshtml.HTMLDocumentClass)ie.Document; 
+0

Спасибо за ваш ответ, но у меня возникают проблемы при получении этой линии работать. Это приводит к следующей ошибке компилятора: «Interop type« mshtml.HTMLDocumentClass »не может быть встроен. Вместо этого используйте соответствующий интерфейс». Есть идеи? – Evan

+0

(по этой строке я имею в виду «mshtml.HTMLDocumentClass doc = (mshtml.HTMLDocumentClass) ie.Document;» – Evan

+0

Добавили ли вы ссылку на Microsoft.mshtml в своих ссылках? (А не в Interop). Это находится в списке .net –

1

Вы должны получить доступ к document.parentWindow в потоке STA. Это может вам помочь:

private WebBrowser _webBrowser; //initialize this somewhere 

    private void ExecuteJavaScript() 
    { 
    Thread aThread = new Thread(ExecuteJavaScriptWorker); 
    aThread.SetApartmentState(ApartmentState.STA); 
    aThread.Start(); 
    } 

    private void ExecuteJavaScriptWorker() 
    { 
     HTMLDocument _document = _webBrowser.Document; 
     _document.parentWindow.execScript("alert('Arbitrary javascript code')", "javascript"); 
    } 
1

Это пример того, как получить документ на какой-либо странице.Это близко к примерам, показанным выше, с небольшой (но важной) разницей - я использую метод Navigate2 - этот работает правильно.

public static mshtml.HTMLDocument NavigateTo(String anUrl) { 
    object locEmpty = 0; 
    object locUrl = anUrl; 
    SHDocVw.InternetExplorer _ie = new SHDocVw.InternetExplorer(); 
    _ie.Visible = true; 
    _ie.Navigate2(locUrl, ref locEmpty, ref locEmpty, ref locEmpty, ref locEmpty); 
    return(_ie.Document); 
} 

Этот пример будет работать для всех страниц, открытых IE в обычном (не модальном) окне. Для модальных окон (или модальных диалогов) этот пример не работает.

0

вы можете просто сделать:

ie.Navigate("javascript:" + jsScript); 

где есть ваш экземпляр InternetExplorer

+1

Очень ограниченный! с точки зрения того, какой код вы можете выполнить! –

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