我正在尝试编写一个程序,只需单击即可打开多个文档,并为每个单独的文档窗口指定大小和位置。在尝试打开第二个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。任何帮助修复此错误都将非常感激。
答案 0 :(得分:4)
当您尝试打开Word或Excel文档时,正在执行的应用程序(取决于版本)只查找已运行的同一应用程序,请求它打开一个新的“窗口”并关闭。这意味着您实际运行的应用程序从未真正获得消息泵 - 这会导致WaitForInputIdle
向InvalidOperationException
发送documented
我建议您只是尝试捕获并忽略该异常 - 我不确定是否有任何方法可以判断Word / Excel是否通过Process.Start
成功打开了文档
更新:从概念上讲,如果你做获得异常,这意味着Word / Excel找到了另一个正在运行的实例并切换到它 - 所以,大概是某种程度的“成功”。
答案 1 :(得分:3)
当您打开第二个Word或Excel文档时,启动过程会检测到Word / Excel已经启动,只是向另一个进程发送文档信息并关闭。
一个更简单的应用程序,例如记事本,没有这种行为。
这意味着,在这种情况下,您第二次启动的Process
实例值得精确zilch,以便控制正在打开的文档。
答案 2 :(得分:0)