【问题标题】:Opening multiple documents with Process.Start()使用 Process.Start() 打开多个文档
【发布时间】:2013-02-14 06:24:10
【问题描述】:

我正在尝试编写一个程序,只需单击一下即可打开多个文档,并为每个单独的文档窗口指定大小和位置。在我尝试打开第二个 Word 或 Excel 文档之前,我使用一个基本程序来测试打开和定位操作取得了不错的成功。

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        [DllImport("user32.dll", SetLastError = true)]
        internal static extern bool MoveWindow(IntPtr hWnd, int X, int Y, int nWidth, int nHeight, bool bRepaint);

        static void Main(string[] args)
        {
            Process resize = new Process();

            resize.StartInfo.FileName = "C:\\Users\\Pete\\Desktop\\TEST1.txt";
            resize.Start();
            resize.WaitForInputIdle();
            MoveWindow(resize.MainWindowHandle, 10, 10, 500, 500, true);

            resize.StartInfo.FileName = "C:\\Users\\Pete\\Desktop\\MSWTEST1.docx";
            resize.Start();
            resize.WaitForInputIdle();
            MoveWindow(resize.MainWindowHandle, 20, 20, 500, 500, true);

            resize.StartInfo.FileName = "C:\\Users\\Pete\\Desktop\\MSXTEST1.xlsx";
            resize.Start();
            resize.WaitForInputIdle();
            MoveWindow(resize.MainWindowHandle, 30, 30, 500, 500, true);

            resize.StartInfo.FileName = "C:\\Users\\Pete\\Desktop\\TEST2.txt";
            resize.Start();
            resize.WaitForInputIdle();
            MoveWindow(resize.MainWindowHandle, 40, 40, 500, 500, true);

            resize.StartInfo.FileName = "C:\\Users\\Pete\\Desktop\\MSWTEST2.docx";
            resize.Start();
            resize.WaitForInputIdle();
            MoveWindow(resize.MainWindowHandle, 50, 50, 500, 500, true);

            resize.StartInfo.FileName = "C:\\Users\\Pete\\Desktop\\MSXTEST2.xlsx";
            resize.Start();
            resize.WaitForInputIdle();
            MoveWindow(resize.MainWindowHandle, 60, 60, 500, 500, true);
         }
    }
}

程序尝试使用记事本打开两个 .txt 文件,使用 MSWord 打开两个 .docx 文件,使用 MSExcel 打开两个 .xlsx 文件。无论我以何种顺序打开程序中的文档,都会在打开第二个 Word 或 Excel 文件后立即在 WaitForInputIdle 行上引发 InvalidOperationException。任何解决此错误的帮助将不胜感激。

【问题讨论】:

  • 如果您不重复使用resize,是否会出现同样的问题,即每个都有不同的Process
  • 为什么要在 SAME 进程中 Start() 多个文档(调整大小)?
  • @Austin - 是的,无论我使用 1 个进程还是 6 个进程,都会出现同样的问题。
  • 或者你可以通过静态:Process proc = Process.Start(Execut, args);。这样您就知道您将始终拥有一个新窗口。编辑:没有用办公文件测试它,只有 chrome。

标签: c# .net


【解决方案1】:

当您尝试打开 Word 或 Excel 文档时,正在执行的应用程序(取决于版本)只是寻找已在运行的相同应用程序,要求它打开一个新的“窗口”并关闭。这意味着您实际运行的应用程序永远不会真正收到消息泵——这会导致WaitForInputIdle 抛出InvalidOperationException(如documented

我建议您只是尝试捕获并忽略异常-我不确定是否有任何方法可以判断 Word/Excel 是否通过Process.Start 成功打开了文档 更新:从概念上讲,如果您确实得到了异常,这意味着 Word/Excel 找到了另一个正在运行的实例并切换到它——所以,大概这是某种程度的“成功”。

【讨论】:

  • 非常感谢您的回答。解释了它发生的原因以及如何处理它。我还不能投票,所以我就给它+1。
【解决方案2】:

当您打开第二个 Word 或 Excel 文档时,启动进程检测到 Word/Excel 已经启动,并简单地将文档信息发送给其他进程并关闭。

更简单的应用程序(例如记事本)没有这种行为。

这意味着,在这种情况下,您第二次启动的Process 实例值得精确地使用zilch,以便控制正在打开的文档。

【讨论】:

  • 所以这可以诊断问题,但如果您还包括解决问题的适当解决方案,答案将会大大改善。
  • 感谢您解释为什么会发生这种情况,因为这些信息肯定会对未来有用。
  • @Servy:你是对的 - 但我不知道限制条件,而且我没有看到保持相同通用性的解决方案。仅处理 MS Office 的情况就足够了吗?应该考虑 OpenOffice 吗?例如,如果具有类似“附加到正在运行的进程”行为的 SublimeText 被用作默认文本编辑器?
  • @Jean - 鉴于您的解释,如果我进一步澄清我的应用程序只需要处理 .txt、.docx 和 .xlsx 文件,您能否建议一种方法来设置第二个 Word 的位置或Excel 文档窗口,因为我无法使用 MainWindowHandle,因为此时代码中的进程已关闭?
  • @PeteHogrefe 我稍后会调查。
【解决方案3】:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-19
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多