【问题标题】:Get Excel.Application object from Process or hwnd in .NET从 .NET 中的 Process 或 hwnd 获取 Excel.Application 对象
【发布时间】:2016-02-25 02:11:08
【问题描述】:

在 C# 中,我试图从 Process 对象中获取 Excel.Application 对象的实例。这似乎应该很简单,但我无法弄清楚,也找不到示例。再说一遍,我有一个 System.Diagnostics.Process 对象,我知道它指的是一个正在运行的 Excel 实例。我现在需要恢复一个引用该进程的 Microsoft.Office.Interop.Excel.Application 对象,以便我可以从 C# 开始操作 Excel 应用程序。

如果它更简单,我还拥有与活动 Excel 窗口相关联的 HWND id 和窗口文本。

谢谢。

【问题讨论】:

标签: c# excel


【解决方案1】:

【讨论】:

  • 我不清楚这是怎么回答的,因为另一个线程给你一个 Excel 实例的IntPtr HWind,但它仍然没有给你Microsoft.Office.Interop.Excel.Application 对象......我我错过了什么?
  • 没关系,我之所以感到困惑是因为答案实际上与不再起作用的外部链接有关。其实别人发的代码@pastebin.com/F7gkrAST
【解决方案2】:

How to use Visual C# to automate a running instance of an Office program

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;
}

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

【讨论】:

  • 对不起,我应该提到我已经考虑过这个选项。不幸的是,这种常用方法对我不起作用,因为无论有多少 Excel 实例正在运行,我都需要能够获取最后一个活动的 Excel 窗口。即使有多个实例在运行,GetActiveObject 也会始终提供对同一个 Excel 实例的引用。
【解决方案3】:

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

http://www.codeproject.com/Tips/1080611/Get-a-Collection-of-All-Running-Excel-Instances

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-08
    • 2016-04-28
    • 2013-07-19
    • 1970-01-01
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    相关资源
    最近更新 更多