Я использую
SHDocVw.InternetExplorer ie = new SHDocVw.InternetExplorer()
для управления / автоматизации экземпляра Internet Explorer. На некоторых страницах я хотел бы запустить функцию JavaScript ( init ()
). Кажется, лучший способ сделать это - использовать метод
InvokeScript
, и я безуспешно пытаюсь сделать следующее:
void ie_DocumentComplete(object pDisp, ref object URL)
{
System.Windows.Forms.HtmlDocument doc = ie.Document;
doc.InvokeScript("init");
}
. Документ является нулевым. Я не могу получить 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;
Любые идеи о том, как заставить это работать - или еще лучший способ запуска сценариев на странице?
Спасибо !!
РЕДАКТИРОВАТЬ :
Другой способ запуска функции 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
. Любые идеи? (Как и я' перед выполнением этого кода мы убедились, что страница полностью загружена)
Проблема была связана с потоками - я потратил столько времени на проблемы с 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");
}));
Надеюсь, это кому-нибудь поможет!
SHDocVw.InternetExplorer.Document имеет тип mshtmlHTMLDocumentClass, поэтому вам нужно ссылаться на Microsoft.mshtml
mshtml.HTMLDocumentClass doc = (mshtml.HTMLDocumentClass)ie.Document;
Объект ie также должен куда-то перейти, чтобы документ имел значение. например
object test = new object();
ie.Navigate("c:\\tmp\\test1.html", ref test, ref test, ref test, ref test);
Total 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;