使用Process.Start()打开多个文档

本文关键字:文档 Process Start 使用 | 更新日期: 2023-09-27 17:59:03

我正在尝试编写一个程序,该程序将通过单击打开多个文档,并为每个单独的文档窗口指定大小和位置。我用一个测试打开和定位操作的基本程序取得了相当大的成功,直到我试图打开第二个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。如有任何帮助修复此错误,我们将不胜感激。

使用Process.Start()打开多个文档

当您尝试打开Word或Excel文档时,正在执行的应用程序(取决于版本)只需查找已运行的同一应用程序,要求它打开一个新的"窗口"并关闭。这意味着您实际运行的应用程序从未真正获得消息泵——这导致WaitForInputIdle运行InvalidOperationException(如文档所示)

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

当您打开第二个Word或Excel文档时,启动进程检测到Word/Excel已经启动,只需向另一个进程发送文档信息即可关闭。

一个更简单的应用程序,比如记事本,没有这种行为。

这意味着,在这种情况下,为了控制正在打开的文档,您第二次启动的Process实例的价值精确到零。

如何使用多个Process对象或尝试像这样的MS Office INterrop程序集

http://www.c-sharpcorner.com/UploadFile/mgold/CreatingandOpeningMicrosoftDocumentfrom.NETUsingCSharp11262005050939AM/CreatingandOpeningMicrosoftDocumentfrom.NETUsingCSharp.aspx