繁体   English   中英

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

[英]How to get Excel instance or Excel instance CLSID using the Process ID?

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

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

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

GetActiveObject(ref _guid, _ptr, out objApp);

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

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

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

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

int hwnd = (int)Process.GetCurrentProcess().MainWindowHandle

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

int excelId = 1234; // Change as appropriate!
int hwnd = (int)Process.GetProcessById(excelId).MainWindowHandle

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

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

希望这可以帮助,

麦克风

ROT条目未标记为CLSID。 ROT从Register返回一个DWORD,它用作取消注册的标识符。 我以前遇到过这个问题,我解决它的唯一方法是在每个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等于特定值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM