2011-01-20 2 views
4

Comment faire en sorte que la fenêtre de l'application gère ou gère le processus du processus Excel qui appartient à l'instance d'application Excel que nous avons créée? Nous utilisons Interop.Excel.dll Version 1.3.0.0. La classe d'application semble n'avoir aucune propriété HWnd à appeler.Comment obtenir une fenêtre ou un handle de processus d'un certain processus Excel?

Notez que ce n'est pas une solution de trouver simplement tous les processus avec le nom excel.exe parce que nous avons beaucoup d'instances d'Excel s'exécutant en parallèle et nous voulons seulement fermer une certaine instance.

Excel.Application app = new Excel.Application(); 
// .. do something with excel here 
app.Quit(); 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 
// this is in some cases still not enough to get excel killed 
uint processID;   
GetWindowThreadProcessId((IntPtr)hWnd, out processID); // how to get HWnd from this Excel application? 
Process.GetProcessById((int)processID).Kill(); 

Répondre

1

Bien que tous les réponses que j'ai eu n'ont pas aidé, merci pour les réponses de toute façon. Je trouvai une solution de contournement par moi-même:

Je créé un processus de travail qui périodiquement contrôles pour les processus Excel qui sont plus d'une minute. Étant donné que mon traitement Excel ne devrait jamais durer plus d'une minute, je peux être sûr que les processus excel de plus d'une minute sont terminés, donc je peux tuer ce processus.

Une autre façon qui me vient à l'esprit est d'obtenir une liste de tous les processus Excel avant de instancier votre processus Excel. Puis après l'instanciation, vous vérifiez à nouveau. Le pid qui est nouveau, est le nouveau processus d'Excel. N'oubliez pas de mettre une instruction lock autour de ceci pour annuler les problèmes de multithreading.

0

Vous pouvez utiliser cette construction pour les appels API Windows fonction

[DllImport("user32.dll")] 
     static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 
    IntPtr hWnd = FindWindow("XLMAIN", null); 

Mais vous devez le faire avant toute opération avec objet Application - créer, VISIBLE = true et ligne de code suivante se poignée

+3

Cela va trouver n'importe quelle fenêtre d'Excel mais pas une certaine fenêtre Excel – codymanix

2

La classe d'application semblent avoir aucune propriété hwnd appeler

La classe Excel.Application a une propriété Hwnd.

En réponse au commentaire:

Nous n'utilisons Microsoft.Office.Interop.Excel.dll mais interop.excel.dll qui manque cette propriété

Je recommande en général en utilisant le PIA (Microsoft.Office.Interop.Excel.dll). Si vous avez une bonne raison de ne pas vouloir le faire, et le RCW que vous utilisez ne pas exposer la propriété pour une raison quelconque, une alternative serait d'utiliser la liaison tardive, par exemple:

typeof(Excel.Application).InvokeMember("Hwnd", BindingFlags.GetProperty, null, app, null); 
+0

Nous n'utilisons pas Microsoft.Office.Interop.Excel.dll mais à la place Interop.Excel.dll qui n'a pas cette propriété. – codymanix

Questions connexes