Получить экземпляр приложения Excel с C # по Handle - PullRequest
9 голосов
/ 13 июля 2009

У меня есть простое приложение на c #, которое должно записывать некоторые значения в диапазонах Excel определенной таблицы. Я создаю экземпляр приложения Excel, если он не существует, но если он существует, я хочу установить его активным и взять экземпляр, если он будет использоваться в моем коде.

Я использую этот код для создания нового приложения:

Microsoft.Office.Interop.Excel app = 
   new Microsoft.Office.Interop.Excel.Application();
app.Visible = true;

Чтобы получить дескриптор активного окна Excel, я использую этот API

[DllImportAttribute("User32.dll")]
private static extern int FindWindow(String ClassName, String WindowName);

Как получить экземпляр приложения Excel с помощью дескриптора?

int hWnd = FindWindow(null, "Microsoft Excel - MySheet.xlsx");
Microsoft.Office.Interop.Excel app = ....(hWnd)

Ответы [ 3 ]

19 голосов
/ 13 июля 2009

Используйте следующий код для получения первого запущенного экземпляра Excel:

oExcelApp =  (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");

Пример

public Excel.Application StartExcel()
{
    Excel.Application instance = null;
    try
    {
       instance = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
    }
    catch (System.Runtime.InteropServices.COMException ex)
    {
       instance = new Excel.ApplicationClass();
    }

    return instance;
}
13 голосов
/ 23 марта 2011

Может быть запущено несколько экземпляров Excel.

GetActiveObject (...) просматривает таблицу запущенных объектов (ROT) и выдаст вам последний открытый экземпляр Excel - не обязательно тот, который соответствует дескриптору окна.

Вы ищете AccessibleObjectFromWindow (..). Сообщение Эндрю Уайтчепела , на которое ссылается другой ответ, показывает, как использовать эту функцию.

Другая ссылка - http://blogs.officezealot.com/whitechapel/archive/2005/04/10/4514.aspx.

2 голосов
/ 13 июля 2009

Вы можете использовать Marshal.GetActiveObject, подробности смотрите в этом блоге:

http://blogs.msdn.com/andreww/archive/2008/11/30/starting-or-connecting-to-office-apps.aspx

...