C# 从.NET中的Process或hwnd获取Excel.Application对象

C# 从.NET中的Process或hwnd获取Excel.Application对象,c#,excel,C#,Excel,在C语言中,我试图从进程对象获取Excel.Application对象的实例。这看起来应该很简单,但我无法理解,也找不到一个例子。重复一下,我有一个System.Diagnostics.Process对象,我知道它引用了一个正在运行的Excel实例。我现在需要恢复引用该进程的Microsoft.Office.Interop.Excel.Application对象,以便从C开始操作Excel应用程序 为了使它更简单,我还提供了与活动Excel窗口关联的HWND id和窗口文本 谢谢 不确定是否严格

在C语言中,我试图从进程对象获取Excel.Application对象的实例。这看起来应该很简单,但我无法理解,也找不到一个例子。重复一下,我有一个System.Diagnostics.Process对象,我知道它引用了一个正在运行的Excel实例。我现在需要恢复引用该进程的Microsoft.Office.Interop.Excel.Application对象,以便从C开始操作Excel应用程序

为了使它更简单,我还提供了与活动Excel窗口关联的HWND id和窗口文本

谢谢


不确定是否严格需要从Process类检索应用程序对象?希望这有帮助。

在另一篇SO帖子上回答:


我创建了一个类,该类可以遍历所有正在运行的Excel实例,还可以通过Hwnd、ProcessID或流程对象查找应用程序实例

答案基本上是对Win32 API的大量丑陋的外部调用,这些调用最好隐藏在干净的公共接口后面


这还没有在所有版本的Excel或Windows上进行测试。

对不起,我应该提到我已经考虑过这个选项。不幸的是,这种常用方法对我不起作用,因为无论有多少Excel实例正在运行,我都需要能够获取最后一个活动的Excel窗口。GetActiveObject将始终传递对同一Excel实例的引用,即使有多个实例正在运行。我不清楚这是一个什么样的答案,因为另一个线程为您提供了Excel实例的IntPtr HWind,但它仍然没有为您提供Microsoft.Office.Interop.Excel.Application对象。。。我遗漏了什么吗?不管怎样,我之所以困惑是因为答案实际上与一个不再工作的外部链接有关。事实上,其他人发布了代码@
using Excel = Microsoft.Office.Interop.Excel;
:    

private void button1_Click(object sender, System.EventArgs e)
{

    //Excel Application Object
    Excel.Application oExcelApp;

    this.Activate();

    //Get reference to Excel.Application from the ROT.
    oExcelApp =  (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");

    //Display the name of the object.
    MessageBox.Show(oExcelApp.ActiveWorkbook.Name);

    //Release the reference.
    oExcelApp = null;
}