2010-06-08 3 views
5

In C# ich versuche, eine Instanz eines Excel.Application -Objekts von einem Process -Objekt zu erhalten. Es scheint, als sollte es wirklich einfach sein, aber ich kann es nicht herausfinden und kann kein Beispiel finden. Um dies zu wiederholen, habe ich ein System.Diagnostics.Process-Objekt, von dem ich weiß, dass es auf eine laufende Excel-Instanz verweist. Ich muss jetzt ein Microsoft.Office.Interop.Excel.Application-Objekt wiederherstellen, das auf den Prozess verweist, damit ich die Excel-Anwendung aus C# manipulieren kann.Get Excel.Application -Objekt von Process oder HWND in .NET

Falls es einfacher wird, habe ich auch die HWND-ID und den Fenstertext mit dem aktiven Excel-Fenster verknüpft.

Danke.

+0

mögliche Duplikate von [Wie bekomme ich Excel-Instanz oder Excel-Instanz CLSID mit der Prozess-ID?] (Http://stackoverflow.com/questions/770173/how-to-get-excel-instance-or-excel-instance -clsid-using-the-process-id) – Helen

Antwort

2
+0

Vielen Dank. Ich konnte das zur Arbeit bringen. – Abiel

+0

Ich bin nicht klar darüber, wie dies eine Antwort ist, da der andere Thread gibt Ihnen eine "IntPtr HWind" der Excel-Instanz, aber es gibt immer noch nicht "Microsoft.Office.Interop.Excel.Application" -Objekt. Vermisse ich etwas? – Antony

+0

Nevermind, der Grund, warum ich verwirrt war, war, weil die Antwort tatsächlich auf einen externen Link bezogen ist, der nicht mehr funktioniert. Tatsächlich hat jemand anderes den Code unter http://pastebin.com/F7gkrAST gepostet – Antony

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

Nicht sicher, ob Sie streng Anwendungsobjekt aus der Process-Klasse abrufen müssen? Hoffe das hilft.

+2

Entschuldigung, ich hätte erwähnen sollen, dass ich diese Option bereits erwogen habe. Leider funktioniert dieser allgemeine Ansatz bei mir nicht, da ich das letzte aktive Excel-Fenster abrufen muss, unabhängig davon, wie viele Instanzen von Excel dort ausgeführt werden. GetActiveObject liefert immer einen Verweis auf dieselbe Excel-Instanz, auch wenn mehrere Instanzen ausgeführt werden. – Abiel

1

ich eine Klasse erstellt haben, die durch alle laufenden Excel-Instanzen durchlaufen können und Nachschlag auch Anwendungsinstanzen von Hwnd, ProcessID oder ein Prozessobjekt.

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

Die Antwort ist im Grunde eine Menge hässliche extern Anrufe an die Win32-API, die hinter einer sauberen öffentlichen Schnittstelle versteckt am besten links sind.

Dies wurde nicht für alle Versionen von Excel oder Windows getestet.