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

Vic*_*Vic 12 c# excel

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

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

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

GetActiveObject(ref _guid, _ptr, out objApp);
Run Code Online (Sandbox Code Playgroud)

最终将返回我需要的excel实例.

Mik*_*lum 12

通过进程ID识别进程后,可以获取Process.MainWindowHandle,然后将其与AccessibleObjectFromWindow API一起使用,以访问该进程的Excel对象模型.

Andrew Whitechapel 在一个Shimmed Automation Add-in中获取应用程序对象的文章详细描述了这种技术,以及示例代码.

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

int hwnd = (int)Process.GetCurrentProcess().MainWindowHandle
Run Code Online (Sandbox Code Playgroud)

在您的情况下可能看起来更像:

int excelId = 1234; // Change as appropriate!
int hwnd = (int)Process.GetProcessById(excelId).MainWindowHandle
Run Code Online (Sandbox Code Playgroud)

其中'excelId'是您要查找的进程ID号.否则,代码应与文章中给出的代码基本相同.(忽略他的代码是为加载项编写的事实;这方面不会影响你的需求,所以只需忽略它.)

如果您没有进程ID,那么您可以使用Process.GetProcessesByName,根据需要,您可以枚举每个Excel并获取对象模型的控制权.

希望这可以帮助,

麦克风

  • 文章已关闭,但这里是我发现的代码的粘贴框http://pastebin.com/F7gkrAST (2认同)