2

我正在尝试编写一个程序,只需单击一下即可打开多个文档,并为每个单独的文档窗口指定大小和位置。在我尝试打开第二个 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。任何解决此错误的帮助将不胜感激。

4

3 回答 3

5

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

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

于 2013-02-13T17:34:44.783 回答
3

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

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

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

于 2013-02-13T17:34:07.237 回答
0

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

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

于 2013-02-13T17:30:36.077 回答