我有一个Microsoft.Office.Interop.Excel.Application
的实例。为了确保EXCEL.EXE
进程及时死亡,我需要找到在创建Application
对象时实例化的ProcessID。
当Excel Application
有窗口时,我发现了samples。
有没有办法为“隐藏”实例执行此操作,即没有窗口绑定到EXCEL.EXE
进程,即未设置excelApp.Hwnd
时?
答案 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进程不会终止(除非你非常迂腐地确保你释放对任何对象的每个引用你明确使用了。)