繁体   English   中英

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

[英]System.Diagnostics.Process.Start() strange behaviour

我有一个使用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扩展名的应用程序。 如果应用程序是“Windows Photo Viewer”,Process.Start(“file.jpg”)将返回null,但如果我将其更改为“Paint”,则它不会返回null。 那是怎么回事? 那我该怎么办呢?

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

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

这是通常用于避免程序的多个实例的方式......

您不能依赖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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM