我试图确定是否打开了运行特定文件的Excel实例,如果是这样,请附加到该实例,以便我可以控制该实例。
我已经四处寻找,而我所获得的大部分内容都来自this问题。它引用了另一个site,但遗憾的是它已经死了,所以我无法阅读它。
到目前为止我的代码是;
//Is Excel open?
if (Process.GetProcessesByName("EXCEL").Length != 0)
{
Process[] processes = Process.GetProcesses();
foreach (Process process in processes)
{
//Find the exact Excel instance
if (process.ProcessName.ToString() == "EXCEL" && process.MainWindowTitle == ("Microsoft Excel - " + fileName))
{
//Get the process ID of that instance
int processID = (int)Process.GetProcessById(process.Id).MainWindowHandle;
//Attach to the instance...
Excel.Application existingExcel = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject(process.Id);
}
}
}
到目前为止,我已经设法获取了我要附加的实例的进程ID,但是在使用该ID时我已经丢失了。
关于如何进行的任何想法?
答案 0 :(得分:5)
Marshal.GetActiveObject()
不会将进程ID作为参数。你想要的是:
Marshal.GetActiveObject("Excel.Application");
请注意,这根本不需要跟踪过程,只需要一个。
如果您可以拥有多个进程并希望附加到特定进程,则会变得更加复杂。这就是对另一个问题的回答。
在http://blogs.msdn.com/b/andreww/archive/2008/11/30/starting-or-connecting-to-office-apps.aspx上还有一篇很好的文章,更全面地介绍了启动excel的不同方法。请注意,并非所有这些都必须与Excel 2013保持同步,因为对于所有Excel窗口而言,只有一个进程会使事情变得复杂。但是,出于您的目的,GetActiveObject
解决方案应该没问题。