如何在C#中启动System.Diagnostics.Process?

时间:2010-08-07 06:16:50

标签: c# html process printing

当我运行此代码时:

        Process printjob = new Process();
        printjob.StartInfo.FileName = "file.html";
        printjob.StartInfo.UseShellExecute = true;
        printjob.StartInfo.Verb = "print";
        printjob.StartInfo.CreateNoWindow = true;
        printjob.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        printjob.Start();

抛出此异常:
“没有应用程序与此操作的指定文件关联”
我该怎么办?

2 个答案:

答案 0 :(得分:1)

在您的计算机上,没有应用程序与文件类型“.html”相关联。如果您尝试在网络浏览器中查看,请考虑启动 iexplore.exe (例如,启动Internet Explorer),然后将 file.html 包括为一个参数。

例如:

Process.Start("IExplore.exe", @"C:\myPath\file.html");

答案 1 :(得分:1)

以下代码段应该可以使用,但它确实存在可能成为交易破坏者的问题(继续阅读以获得解释):

static void Main(string[] args)
{
    string pathToFile = "...";
    var processStartInfo = new ProcessStartInfo(); 
    processStartInfo.Verb = "print";
    processStartInfo.FileName = pathToFile;     

    var process = Process.Start(processStartInfo);
    process.WaitForExit();
}

上面代码的唯一问题是会显示打印对话框。我无法找到压制它的方法,而且它似乎是一个特定的问题(或功能)打印HTML文件。

如果您能够容忍打印对话框出现一秒左右,那么就会有一个丑陋的解决方法,那就是模拟通过代码将“enter”键发送到打印对话框。最简单的方法是使用System.Windows.Forms.SendKeys类,特别是SendWait方法。

因此修订后的代码段如下所示:

static void Main(string[] args)
{
    string pathToFile = "...";
    var processStartInfo = new ProcessStartInfo(); 
    processStartInfo.Verb = "print";
    processStartInfo.FileName = pathToFile;     

    var process = Process.Start(processStartInfo);

    System.Threading.Thread.Sleep(1000);
    System.Windows.Forms.SendKeys.SendWait("{ENTER}");

    process.WaitForExit();
}

在发送按键之前,必须调用Sleep以确保打印对话框已完全加载并准备好接收用户输入。

HTH