2012-02-29 208 views
0

在我的程序中,我想打开一个Excel文件并给出Excel焦点。如何通过C#打开Excel并提供Excel焦点

我使用process.Start()来做到这一点,它只能在第一次打开Excel时运行,它会启动Excel并为其提供焦点。

但是,如果我不收集第一个Excel或者这已经是我的系统中打开的Excel,并且返回到我的程序,打开另一个Excel,这次,新打开的Excel不会被带到前台并没有重点。

我试图使用Windows API来获取窗口和设置的重点,但它抛出一个异常时,打开第二个Excel中:

process.MainWindowHandle = 'process.MainWindowHandle' threw an exception of type 'System.InvalidOperationException' 

谁能帮助我?提前致谢。

回答

1

在尝试访问MainWindowHandle之前,您很可能只需致电WaitForInputIdle。这将一直等到Excel启动后才能分配主窗口句柄。

现在我发现的另一件事是,Excel可能会耗尽一个进程。因此,第二次执行Process.Start()时,实际发生的情况是第二个进程将请求传递给第一个进程,然后立即关闭。你可以使用任务管理器来测试这个假设。如果我是对的,那么使用Process.GetProcesses()来获取所有正在运行的进程的列表,找到Excel进程并给出主窗口的焦点。

+0

我试过添加WaintForInputIdle,第一次打开excel,没关系,但是在那之后,如果我尝试打开另一个Excel,我会得到一个异常'没有进程与此对象关联。在process.WaitForInputIdle()和进程的每个属性都是[process.xxxx'抛出'System.InvalidOperationException'类型的异常],就像一个没有调用start()方法的进程一样。 – zousijiu 2012-02-29 13:02:07

+0

好的,我有另外一个想法。我在这里猜测,因为它很难通过堆栈溢出进行调试! – 2012-02-29 13:12:57

0

而不是直接shell到Excel,只需指定您的excel文件作为文件名,并确保它被设置为使用ShellExecute。这将以与在资源管理器中双击相同的方式加载它。它还具有与其他excel观众一起工作的优势。