【发布时间】:2012-06-06 19:57:38
【问题描述】:
我有一个使用 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() 。每个跟踪语句 在运行时打印在 cmets 中具有“
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 照片查看器”但如果我将其更改为 “绘制”它不返回 null。那是怎么回事?我怎样才能得到 那么处理呢?
好的,一切都完成了,抱歉细节,但希望我能解释一下情况 我正在努力解决!
【问题讨论】:
-
出于好奇,您需要对 MainWindowHandle 做什么?也许有更好的方法!
-
我需要跟踪窗口的位置/大小,我目前正在使用 GetWindowRect(),它将窗口句柄作为输入。由于 Process.Start() 的限制,我还必须根据知道文件名和有时知道进程名来“猜测”活动窗口是什么。理想情况下,我不想猜测! :-)
标签: c# process.start