如何获得某个Excel进程的窗口或进程句柄?

我们如何获得属于我们创build的Excel应用程序实例的Excel进程的应用程序窗口句柄或进程句柄? 我们正在使用Interop.Excel.dll版本1.3.0.0。 应用程序类似乎没有HWnd属性来调用。

请注意,找不到名称为excel.exe的所有进程是无法解决的,因为我们有许多并行运行的excel实例,我们只想closures某个实例。

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(); 

应用程序类似乎没有HWnd属性来调用

Excel.Application类有一个属性Hwnd。

回应评论:

我们没有使用Microsoft.Office.Interop.Excel.dll,而是使用缺less这个属性的Interop.Excel.dll

我通常会推荐使用PIA(Microsoft.Office.Interop.Excel.dll)。 如果你有一个很好的理由不想这样做,而且你正在使用的RCW不会因为某种原因而暴露该属性,那么另一种方法是使用后期绑定,例如:

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

虽然我得到的所有答案都没有帮助,但是谢谢你的答案。 我现在发现了一个解决方法:

我现在创build了一个工作进程定期检查超过一分钟的 excel进程。 由于我的excel处理永远不会超过一分钟,所以我可以确定excel进程超过一分钟就完成了,所以我可以杀死这个进程。

现在我想到的另一种方法是实例化您的Excel过程之前获取所有Excel过程列表 。 然后在实例化之后再次检查 。 新的pid是新的excel程序。 请记住在此附上一个locking语句以消除multithreading问题。

您可以使用此构造调用Windows API函数

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

但是你必须在使用Application对象的任何操作之前完成它 – 创build它,设置Visible = true并且用下一行代码获取句柄