Я хочу создать элемент управления WebBrowser, дать ему HTML-код для отображения, а затем вывести его из процесса в своем собственном окне Internet Explorer.
Можно ли это сделать?
- да, это должно быть вне процесса
- У меня уже есть техника, которая включает в себя запись временного файла. я хочу удалить это решение взломать
У меня есть еще три вопроса о работе stackoverflow, все они работают над крошечным сегментом работы следующего кода:
public static void SpawnIEWithSource(String szHtml)
{
IWebBrowser2 ie = (IWebBrowser2)new InternetExplorer();
object mv = System.Reflection.Missing.Value; //special "nothing" value
object url = (String)@"about:blank";
ie.Navigate2(ref url, ref mv, ref mv, ref mv, ref mv);
mshtml.HTMLDocumentClass doc = (mshtml.HTMLDocumentClass)ie.Document;
doc.Write(szHtml);
doc.Close();
ie.Visible = true;
}
Примечание: Приведенный выше код прекрасно работает в нативных приложениях.
Я подумал, что перейду к погоне и посмотрю, есть ли у кого-нибудь другие идеи, которые не включают единственный способ, которым я смог это выяснить.
Решение по взлому, использующее временный файл:
public static void SpawnIEWithSource(String szHtml)
{
IWebBrowser2 ie = (IWebBrowser2)new InternetExplorer();
object mv = System.Reflection.Missing.Value; //special "nothing" value
object url = (String)@"about:blank";
ie.Navigate2(ref url, ref mv, ref mv, ref mv, ref mv);
//Todo: Figure out the .NET equivalent of the following
//so that it doesn't have to write a temporary file
//IDispatch webDocument = ie.Document;
//webDocument.Write(szHtml);
//webDocument.Close();
String tempFilename = Path.GetTempFileName();
try
{
//Rename to .htm, or else ie won't show it as actual HTML
String htmlFile = Path.ChangeExtension(tempFilename, "htm");
File.Move(tempFilename, htmlFile); //.NET's version of File.Rename
tempFilename = htmlFile;
//Write string to file
StreamWriter writer = new StreamWriter(tempFilename);
writer.Write(szHtml);
writer.Close();
url = (String)tempFilename;
ie.Navigate2(ref url, ref mv, ref mv, ref mv, ref mv);
//If we're going to delete the file, then we have to wait for IE to use it
//else we delete it before it uses it
while (ie.ReadyState != tagREADYSTATE.READYSTATE_COMPLETE)
{
System.Threading.Thread.Sleep(10);
}
}
finally
{
File.Delete(tempFilename);
}
//Make IE Visible
ie.Visible = true;
}