Excel在任务管理器中产生了很多僵尸进程,下面的目的是杀死它们。
我有这个辅助方法:
//helper method to kill zombie excel processes
private void KillSpecificExcelFileProcess(string excelFileName)
{
var processes = from p in Process.GetProcessesByName("EXCEL")
select p;
foreach(var process in processes)
{
Console.WriteLine("{2} MainWindowTitle {0} {1}",process.MainWindowTitle,(process.MainWindowTitle == "Microsoft Excel - " + excelFileName).ToString(),excelFileName);
if(process.MainWindowTitle == "Microsoft Excel - " + excelFileName)
process.Kill();
}
}
这写入控制台:
所以该方法是找到Excel进程正常但process.MainWindowTitle
是一个空字符串 - 为什么这个?
编辑
Excel在控制台中打开,如下所示:
using Excel = Microsoft.Office.Interop.Excel;
然后在课堂内:
this.xlApp = new Excel.Application();
this.xlApp.Visible = true;
答案 0 :(得分:2)
process.MainWindowTitle
以以下格式获取进程主窗口的标题:
[filename] - Excel
在您的示例中,process.MainWindowTitle
属性等于
Control.xlsm - Excel
而不是“Microsoft Excel - Control.xlsm”。如果问题仍然存在,请考虑将process.MainWindowTitle
与空字符串匹配!
答案 1 :(得分:1)
这些Excel流程可能是由代码启动的,因此它们没有GUI,因此它们没有窗口标题。
来自 MSDN :
只有当进程具有图形界面时,进程才有与其关联的主窗口。如果关联的进程没有主窗口(以便MainWindowHandle为零),则MainWindowTitle为空字符串(“”)。
更多信息here。
答案 2 :(得分:0)
因此,不是依赖于文件名 - 在工作簿和Excel应用程序关闭后不可见 - 我在操作xl文件时存储了进程ID。然后在书和应用程序关闭后,我使用此Id来关闭僵尸进程。
//get Id when workbook/xlApp are still visible
private int getExcelFileProcessId(string excelFileName)
{
int procId = -1;
var processes = from p in Process.GetProcessesByName("EXCEL")
select p;
foreach(var process in processes)
{
if(process.MainWindowTitle == excelFileName + " - Excel")
{
procId = process.Id;
}
}
return procId;
}
//helper method to kill zombie excel processes
private void KillSpecificExcelFileProcess(int anId)
{
var processes = from p in Process.GetProcessesByName("EXCEL")
select p;
foreach(var process in processes)
{
if(process.Id == anId)
{
process.Kill();
}
}
}