我有一个使用 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。那是怎么回事?那我怎么才能拿到手柄呢?
好的,一切都完成了,抱歉细节,但希望我正在解释我正在努力解决的情况!