通过Handle使用C#获取Excel应用程序的实例

我有一个简单的应用程序,必须在特定的工作表的Excel范围内写入一些值。 我创build一个Excel应用程序的实例,如果不存在,但如果存在,我想设置活动它,并采取一个实例,如果它在我的代码中使用。

我使用这个代码来创build一个新的应用程序:

Microsoft.Office.Interop.Excel app = new Microsoft.Office.Interop.Excel.Application(); app.Visible = true; 

为了得到主动excel窗口的句柄,我使用这个api

 [DllImportAttribute("User32.dll")] private static extern int FindWindow(String ClassName, String WindowName); 

我怎样才能得到一个处理excel应用程序的实例?

 int hWnd = FindWindow(null, "Microsoft Excel - MySheet.xlsx"); Microsoft.Office.Interop.Excel app = ....(hWnd) 

使用以下代码获取Excel的第一个运行实例:

 oExcelApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"); 

 public Excel.Application StartExcel() { Excel.Application instance = null; try { instance = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"); } catch (System.Runtime.InteropServices.COMException ex) { instance = new Excel.ApplicationClass(); } return instance; } 

可能有多个Excel实例正在运行。

GetActiveObject(…)在运行对象表(ROT)中查找,并且会给你打开的最后一个Excel实例 – 不一定是与你拥有的窗口句柄相对应的实例。

您正在寻找AccessibleObjectFromWindow(..)。 链接到另一个答案的Andrew Whitechapelpost展示了如何使用这个函数。

另一个链接 – http://blogs.officezealot.com/whitechapel/archive/2005/04/10/4514.aspx

你可以使用Marshal.GetActiveObject,看到这个博客文章的详细信息:

http://blogs.msdn.com/andreww/archive/2008/11/30/starting-or-connecting-to-office-apps.aspx