7

我有一个使用 Process.Start(string Filename) 打开文件的应用程序。此方法重载将导致系统根据文件扩展名调用适当的应用程序。就我而言,它通常是 WORD、PPT、PDF、JPG 等……某种类型的可查看文档。最终,我需要启动该进程,然后在应用程序中我需要对 MainWindowHandle 值做一些事情。

我发现至少三种不同的情况导致 Process.Start(string filename) 返回不同的方式......

对于下面的第一种和第二种情况,假设我正在打开两个 .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 照片查看器”,则 Process.Start("file.jpg") 返回 null,但如果我将其更改为“Paint”,则它不会返回 null。那是怎么回事?那我怎么才能拿到手柄呢?

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

4

2 回答 2

2

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

这通常是为了避免程序的多个实例而完成的......

于 2012-06-01T15:04:33.623 回答
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

于 2015-04-04T12:54:57.987 回答