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

标签 c# process.start

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

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

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

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

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

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

案例二: 现在假设在调用 Process.Start() AcroRd32 时已经 在先前打开的 pdf 文件上运行。现在事情变得奇怪了。引用 下面的代码(为清楚起见删除了一些错误检查逻辑),在调用之后 到 Process.Start() p.MainWindowHandle 的值为零(即使 窗口已创建),并且 p.MainWindowTitle 为空。然后我睡了1秒 并且句柄仍然为零,但现在填充了主窗口标题(甚至 虽然我在 sleep 后没有调用 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 已经 正在运行,但我无法控制它,我确实需要获得值(value) p.MainWindowHandle 的。任何想法如何处理这个?

案例三: 然后进入第三种情况:在某些情况下,Process.Start() 将返回 null 即使它成功打开文件。我发现情况就是这样 .jpg 文件,但我敢肯定这只取决于应用程序 分配给 .jpg 扩展名。 Process.Start("file.jpg") 返回 null 如果应用程序是“Windows 照片查看器”,但如果我将其更改为 “绘画”它不返回空值。那是怎么回事?我怎样才能得到 然后处理?

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

最佳答案

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

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

关于c# - System.Diagnostics.Process.Start() 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10852598/

相关文章:

c# - 多个控件的一个数据源

c# - 测试一个类是否有一个属性?

c# - 当路径包含 url 片段时,如何在网络浏览器中打开本地 html 文件

c# - 启动 explorer.exe 在 C# 中无法正常工作

先不运行go main函数

c# - ThreadPool.SetMinThreads 在 IIS 托管应用程序中不起作用

c# - OpenFileDialog 在超过 260 个字符的路径上返回空字符串(或根本不返回)

c# - 如何在 LINQ 中执行嵌套的加入、添加和分组?

c# - 如何确保 C# 的 Process.Start 会扩展环境变量?