为什么process.MainWindowTitle返回空字符串?

时间:2015-03-12 10:54:43

标签: c# process

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

这写入控制台:

enter image description here

所以该方法是找到Excel进程正常但process.MainWindowTitle是一个空字符串 - 为什么这个?

编辑
Excel在控制台中打开,如下所示:

using Excel = Microsoft.Office.Interop.Excel;

然后在课堂内:

this.xlApp = new Excel.Application();
this.xlApp.Visible = true;

3 个答案:

答案 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();
    }
  }
}