【问题标题】:How to get Excel instance or Excel instance CLSID using the Process ID?如何使用进程 ID 获取 Excel 实例或 Excel 实例 CLSID?
【发布时间】:2009-04-20 21:27:57
【问题描述】:

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

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

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

GetActiveObject(ref _guid, _ptr, out objApp);

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

【问题讨论】:

  • 你能给我发一个如何使用GetActiveObject方法的示例

标签: c# excel


【解决方案1】:

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

Andrew Whitechapel 的文章Getting the Application Object in a 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,这样您就可以枚举每个进程 ID,并根据需要控制每个 Excel 实例并访问对象模型。

希望这会有所帮助,

迈克

【讨论】:

  • 没问题,维克,很高兴它对你有用。这不是一个简单的问题,也不是众所周知的,但是 Andrew Whitechapel 的文章很好地涵盖了它。祝你好运!
  • 文章已下架,但这是我找到的代码的粘贴箱pastebin.com/F7gkrAST
【解决方案2】:

ROT 条目未使用 CLSID 标记。 ROT 从 Register 返回一个 DWORD,用作 Unregister 的标识符。 我以前遇到过这个问题,我解决它的唯一方法是在每个 Excel 中加载某种加载项,您可以直接与之通信。

【讨论】:

    【解决方案3】:
    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 等于特定值的进程。

    【讨论】:

    • 感谢您的快速回答,这里的问题是我不想终止进程,我需要获取 Excel 实例以使用它,更具体地说,我需要粘贴一些相关信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 2019-07-08
    • 2010-12-23
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多