Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get instance of Excel application with C# by Handle

I have a c# simple application that have to write some values in a excel ranges of a specific worksheet. I create an instance of Excel application if not exist, but if exist i want to set active it and take an instance if it to use in my code.

I use this code to create a new application:

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

To get the handle of active excel window i use this api

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

How can i get an instance of excel application by an handle?

int hWnd = FindWindow(null, "Microsoft Excel - MySheet.xlsx");
Microsoft.Office.Interop.Excel app = ....(hWnd)
like image 559
Babba Avatar asked Jul 13 '09 10:07

Babba


People also ask

What is instance of Excel?

Each iteration of Excel.exe in Task Manager is known as one "instance". Excel has some features that are dependent on the instance it is running inside. You can see it as Excel only being able to communicate fully between files that are running in the same instance.


3 Answers

There might be more than one Excel instance running.

GetActiveObject(...) looks in the Running Object Table (ROT) and would give you the last Excel instance that was opened - not necessarily the one corresponding with the window handle you have.

You're looking for AccessibleObjectFromWindow(..). The Andrew Whitechapel post linked to in the other answer shows how to use this function.

Another link - http://blogs.officezealot.com/whitechapel/archive/2005/04/10/4514.aspx.

like image 62
Govert Avatar answered Oct 30 '22 18:10

Govert


Use the following code to get the first running instance of Excel:

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

Example

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;
}
like image 29
James Avatar answered Oct 30 '22 16:10

James


You can use Marshal.GetActiveObject, see this blog post for details:

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

like image 27
Shiraz Bhaiji Avatar answered Oct 30 '22 18:10

Shiraz Bhaiji