System.Diagnostics.Process.Start()奇怪的行为

时间:2012-06-01 14:54:43

标签: c# process.start

我有一个使用Process.Start(字符串Filename)打开文件的应用程序。此方法重载将导致系统根据文件扩展名调用相应的应用程序。就我而言,它通常是WORD,PPT,PDF,JPG等......某种类型的可查看文档。最后,我需要启动该过程,然后在应用程序中我需要使用MainWindowHandle值执行某些操作。

我发现至少有三种不同的情况导致Process.Start(字符串文件名) 以不同的方式回归......

对于下面的第一个和第二个案例,假设我打开了两个.pdf文件(但是 如果我打开两个.ppt或两个.doc文件,似乎也会发生同样的事情 孔)...

案例1: 如果AcroRd32没有运行,我会做类似的事情。

Process p = Process.Start("yada.pdf");
p.WaitForInputIdle();
p.Refresh();

事情按预期工作。正确填充值p.MainWindowHandle。 这种情况没问题。

案例2: 现在假设在调用Process.Start()时AcroRd32已经存在 在以前打开的pdf文件上运行。现在事情变得怪异了。参考 在调用之后,下面的代码(为清楚起见,删除了一些错误检查逻辑) 到Process.Start()p.MainWindowHandle的值为零(即使是 窗口已创建),而p.MainWindowTitle为空。然后我睡了1秒钟 并且句柄仍为零,但现在填充了主窗口(甚至是 虽然我没有在睡眠后调用p.Referesh()。每个跟踪语句 有“<<<<<<在评论中是在运行时打印的。

Process p = Process.Start("SomeFileName.pdf");
p.WaitForInputIdle();
p.Refresh();
if (p.MainWindowHandle == 0)
    DebugTrace("MainWindowHandle is zero, why??");   //<<<<
if (p.MainWindowTitle.Length == 0)
    DebugTrace("MainWindowTitle is null");           //<<<<
Thread.Sleep(1000);
if (p.MainWindowHandle == 0)
    DebugTrace("MainWindowHandle is still zero.");   //<<<<
if (p.MainWindowTitle.Length == 0)
    DebugTrace("MainWindowTitle is null");
else
    DebugTrace("MainWindowTitle: " + p.MainWindowTitle);  //<<<<

我确信这与AcroRd32已经存在的事实有关 跑步,但我无法控制,我确实需要获得价值 p.MainWindowHandle。任何想法如何处理这个?

案例3: 然后到第三种情况:在某些情况下,Process.Start()将返回null 即使它成功打开文件。我发现这是事实 .jpg文件,但我确信这只取决于已经存在的应用程序 分配给.jpg扩展名。 Process.Start(“file.jpg”)返回null 如果应用程序是“Windows Photo Viewer”,但如果我改变它 “画”它不会返回null。那是怎么回事?我怎么能得到 处理呢?

好的,一切都完成了,抱歉细节,但希望我能解释一下情况 我正在努力工作!

2 个答案:

答案 0 :(得分:2)

我怀疑windows使用acroRd32启动一个新进程,然后acroRd32将给定的文件路径传递给正在运行的实例,然后关闭。

通常这样做是为了避免多个程序实例......

答案 1 :(得分:0)

您不能依赖Process.Start返回的MainWindowHandle。正如您所提到的,当文件被一个运行良好的应用程序打开时,它不会返回它。自Windows Vista以来,MS添加了ReStart Manager,这是一个新的api,可以在给定文件上提供锁定进程。 https://msdn.microsoft.com/en-us/magazine/cc163450.aspx

我对这个问题的反应是尝试Process.Start的MainWindowHandle并且锁定句柄ReStart管理器返回。这是MSDN杂志的一个示例代码。 https://github.com/andrewchaa/PopOpen/blob/master/Pop.Cs/InUseDetection.cs