C# 如何使用进程ID获取Excel实例或Excel实例CLSID?

C# 如何使用进程ID获取Excel实例或Excel实例CLSID?,c#,excel,C#,Excel,我正在使用C#,我需要通过它的进程ID获取一个特定的excel实例;我从另一个应用程序中获得了我需要的实例的进程ID,但我不知道还能做什么,我不知道如何在给定了excel的进程ID的情况下获得一个正在运行的excel实例 我在网上做了很多研究,但我只看到使用Marshal.GetActiveObject(…)或Marshal.BindToMoniker(…)的示例,我不能使用它们,因为第一个实例返回在ROT中注册的第一个Excel实例,而不是我需要的实例,第二个要求您在尝试获取实例之前保存exc

我正在使用C#,我需要通过它的进程ID获取一个特定的excel实例;我从另一个应用程序中获得了我需要的实例的进程ID,但我不知道还能做什么,我不知道如何在给定了excel的进程ID的情况下获得一个正在运行的excel实例

我在网上做了很多研究,但我只看到使用Marshal.GetActiveObject(…)或Marshal.BindToMoniker(…)的示例,我不能使用它们,因为第一个实例返回在ROT中注册的第一个Excel实例,而不是我需要的实例,第二个要求您在尝试获取实例之前保存excel文件

此外,如果我能够使用进程ID获取所需excel实例的CLSID,那么我可能能够调用

GetActiveObject(ref _guid, _ptr, out objApp);
最终将返回我需要的excel实例

using System.Diagnostics;

   var eProcess = from p in Process.GetProcessesByName("EXCEL")
                   where p.Id == 3700 //whatever Id you have...
                   select p;

    foreach (var process in eProcess)
        process.Kill();

这将获取名为“EXCEL”的所有进程,其中进程Id等于一个特定值。

ROT条目没有用CLSID标记。ROT从寄存器返回一个DWORD,用作注销的标识符。
我以前遇到过这个问题,解决这个问题的唯一方法是将某种插件加载到每个Excel中,您可以直接与之通信。

一旦您通过流程id识别流程,您就可以获取,然后使用该插件访问该流程的Excel对象模型

AndrewWhitechapel的文章详细描述了这项技术,以及示例代码

文章中的关键代码从以下行开始:

int hwnd = (int)Process.GetCurrentProcess().MainWindowHandle
在您的情况下,可能更像:

int excelId = 1234; // Change as appropriate!
int hwnd = (int)Process.GetProcessById(excelId).MainWindowHandle
其中,“excelId”是您要查找的进程id号。否则,代码应该与本文中给出的代码基本相同。(忽略他的代码是为外接程序编写的这一事实;这一方面不会影响您在这里的需求,所以忽略它即可。)

如果您没有进程id,那么您可能希望使用,这样您可以根据需要枚举每个进程并获取每个Excel实例的控制权,从而访问对象模型

希望这有帮助


Mike

谢谢你的快速回答,这里的问题是我不想终止进程,我需要获取Excel实例来使用它,更具体地说,我需要在上面粘贴一些信息。没问题,Vic,很高兴它对你有用。这不是一个容易的问题,也不为人所知,但安德鲁·怀特查普(Andrew Whitechapel)的文章对此进行了很好的阐述。祝你好运这篇文章已经结束了,但是这里有一个我找到的代码的粘贴库,你能给我一个如何使用GetActiveObject方法的示例吗