如何获取隐藏的Excel应用程序实例的ProcessID(PID)

时间:2016-06-05 00:31:52

标签: c# excel winapi

我有一个Microsoft.Office.Interop.Excel.Application的实例。为了确保EXCEL.EXE进程及时死亡,我需要找到在创建Application对象时实例化的ProcessID。

当Excel Application有窗口时,我发现了samples

有没有办法为“隐藏”实例执行此操作,即没有窗口绑定到EXCEL.EXE进程,即未设置excelApp.Hwnd时?

1 个答案:

答案 0 :(得分:2)

Application.Hwnd有一个有效的窗口句柄,即使应用程序没有可见的工作簿窗口,您也可以使用它来获取相关Excel应用程序的进程。

[DllImport("user32.dll")]
static extern int GetWindowThreadProcessId(int hWnd, out int lpdwProcessId);

Process GetExcelProcess(Microsoft.Office.Interop.Excel.Application excelApp)
{
     int id;
     GetWindowThreadProcessId(excelApp.Hwnd, out id);
     return Process.GetProcessById(id);
}

void TerminateExcelProcess(Microsoft.Office.Interop.Excel.Application excelApp)
{
     var process = GetExcelProcess(excelApp);
     if (process != null)
     {
          process.Kill();
     }
}

private void button1_Click(object sender, EventArgs e)
{
     // Create Instance of Excel
     Microsoft.Office.Interop.Excel.Application oXL = new Microsoft.Office.Interop.Excel.Application();
     try
     {
          // Work with oXL
     }
     finally
     {
          TerminateExcelProcess(oXL);
     }
}

注意:这个question有一些答案可以解释为什么当你从C#通过自动化完成它时,Excel进程不会终止(除非你非常迂腐地确保你释放对任何对象的每个引用你明确使用了。)