我想创建一个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;
}
注意:以上代码在原生应用中运行良好。
我以为我会切入追逐,看看是否有人有任何其他想法,这并不涉及我能够弄明白的唯一方法。
使用临时文件的hack解决方案是:
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;
}
答案 0 :(得分:1)
之前我这样做的方法是将HTML文件保存到磁盘,并将文件名传递给shell,如下所示:
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.FileName = "C:\Path\To\myHTMLFile.html";
p.StartInfo.UseShellExecute = true;
p.StartInfo.RedirectStandardOutput = false;
p.StartInfo.Arguments = "";
p.Start();
关于这一点的巧妙之处在于它将使用用户的默认Web浏览器打开。如果您需要IE,那么您可能需要深入了解注册表并获取其路径,并专门执行它。
你也可能想要在完成后处理该过程。您可以订阅一个名为Exited的事件,该事件将在您处理该流程时通知您。
答案 1 :(得分:0)
使用HTML加载WebBrowser控件,如下例所示 也许不是一个单独的过程本身,但完成工作。让我知道它是否真的需要在一个单独的过程中,我可能能够像这样工作。 其中涉及System.Diagnostics.Process.start()方法和一些JavaScript。
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
</head>
<body>
<div id="holdingArea" style="display:none">
<div>
<strong>In a new page</strong>
</div>
</div>
<script type="text/javascript">
var h = document.getElementById('holdingArea').innerHTML;
var w = window.open('', '_blank');
w.document.write(h);
</script>
</body>
</html>
答案 2 :(得分:0)
我使用它来创建一个带有独特随机句柄的新IE窗口,以便同时打开多个窗口。
Dim WindowName As String = CStr(Rnd())
WindowName = "W" & Replace(WindowName, ".", "0")
Page.ClientScript.RegisterStartupScript(Me.GetType(), WindowName, WindowName & "=window.open('NominateList.aspx?Inviters=" & InviterList & "','" & WindowName & "','menubar=1,resizable=1,scrollbars=1,status=1,width=900,height=900');" & WindowName & ".moveTo(0,0);", True)
我可以根据需要使用它来旋转多个页面。希望这会有所帮助。
答案 3 :(得分:0)
WebBrowser控件具有 DocumentText 属性。如果将其设置为HTML字符串,则控件将在屏幕上呈现正确的HTML。 希望这有帮助!