2

我尝试使用默认浏览器打开临时 HTML 文件,然后删除该文件:

        var tempFileName = Path.ChangeExtension(Path.GetTempFileName(), "html");
        // I save document to temp file here...

        Process process = null;
        try
        {
            process = Process.Start(tempFileName);
        }
        catch (Win32Exception)
        {
        }
        catch (ObjectDisposedException)
        {
        }
        catch (FileNotFoundException)
        {   
        }

        var worker = new BackgroundWorker();
        worker.DoWork += (s, we) => {
            if (process != null)
            {
                process.WaitForExit();
                try
                {
                    File.Delete(tempFileName);
                }
                catch (IOException)
                {
                }
            }
        };
        worker.RunWorkerAsync();

不幸的是,Process.Start如果未启动进程,但使用正在运行的进程(在 Google Chrome 中打开新选项卡),则返回 null。所以我等不及该进程退出。

所以,一个普遍的问题是:如何完成任务?如何向用户显示临时 HTML 文件并在查看后将其删除?

4

3 回答 3

1

如果您使用ProcessStartInfo并设置,UseShellExecute那么您可以通过直接“运行”HTML 来启动用户的默认浏览器,就像您现在尝试做的那样。我还没有尝试过,但它应该可以帮助您Process确定用户何时关闭浏览器。

我仍然会为一堆你无法控制的边缘情况做准备。例如,如果他们让浏览器保持打开状态,但关闭正在观看浏览器的应用程序。那时你让浏览器保持活力吗?你杀了它吗?什么时候删除 HTML 文件?使用Web Browser控件可能会更好。然后您甚至不必担心其他进程或浏览器兼容性。您甚至可以将 HTML 内容流式传输到控件,以后无需删除任何文件。

于 2015-06-16T14:19:18.417 回答
0

您可以通过首先找出默认浏览器并手动执行它来强制一个新的浏览器实例:

public Process launchBrowser(string url)
{
    string browserName = "iexplore.exe";
    using (RegistryKey userChoiceKey = Registry.CurrentUser.OpenSubKey(@"Software\Microsoft\Windows\Shell\Associations\UrlAssociations\http\UserChoice"))
    {
        if (userChoiceKey != null)
        {
            object progIdValue = userChoiceKey.GetValue("Progid");
            if (progIdValue != null)
            {
                if(progIdValue.ToString().ToLower().Contains("chrome"))
                    browserName = "chrome.exe";
                else if(progIdValue.ToString().ToLower().Contains("firefox"))
                    browserName = "firefox.exe";
                else if (progIdValue.ToString().ToLower().Contains("safari"))
                    browserName = "safari.exe";
                else if (progIdValue.ToString().ToLower().Contains("opera"))
                    browserName = "opera.exe";
            }
        }
    }

    return Process.Start(new ProcessStartInfo(browserName, url));
}

然后你可以得到这个过程的句柄:

var process = launchBrowser("www.google.com");

process.WaitForExit();

try
{
    //Do whatever
}
catch (IOException)
{
}
于 2015-06-16T14:14:10.583 回答
-1

您还可以使用 WebClient 将 html 内容读入 Memory Stream 或字符串变量,关闭 Stream 或 WebClient 后,文件将被释放,准备删除,因为您不再需要它。

他们在内存中有 html 内容,只需将其发送到浏览器即可。

如果您需要,这里有一些示例:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/060ea8e0-cc63-44a3-b0dc-b531c29b8a0f/read-html-content-using-cnet?forum=csharpgeneral

希望能帮助到你。

于 2015-06-16T14:09:45.117 回答