这里的另一个问题。 我只是想知道是否可以使用C#结束任务那些应用程序。
喜欢:有4个记事本应用程序打开。我只想关闭第二个记事本应用程序。但是当我试图使用process.Kill时,所有4个记事本都被关闭了。有没有办法只关闭指定的Noteped?
以下是我的示例代码:
foreach (Process p in Process.GetProcesses("."))
{
if (p.MainWindowTitle.Length > 0)
{
if (p.MainWindowTitle.Substring(0, 31) == "NotepadName.txt")
{
p.Kill();
}
}
}
答案 0 :(得分:3)
您需要使用进程开始时间来查找第二次运行记事本。
Process[] processes = (from prc in Process.GetProcessesByName("notepad")
orderby prc.StartTime
select prc).ToArray();
if (processes.Count() > 1)
processes[1].Kill();
答案 1 :(得分:0)
您遍历foreach (Process p in Process.GetProcesses("."))
循环中的所有流程,并以"NotepadName.txt"
开头的标题终止任何流程。
如果你只想杀死第二个实例,你必须修改循环中的逻辑以使其更具选择性。
int i = 0;
foreach (Process p in Process.GetProcesses("."))
{
if (p.MainWindowTitle.Length > 0)
{
if (p.MainWindowTitle.Substring(0, 31) == "NotepadName.txt")
{
i++;
if(i == 2){
p.Kill();
break;
}
}
}
}
答案 2 :(得分:0)
首先,我认为您的意思是您只想关闭正在查看NotepadName.txt文件的记事本进程。您可能正在尝试拒绝访问该文件(或关闭无论出于何种原因访问该文件的人)。因此,我忽略了“第二”部分。
我运行了您的代码并对其进行了测试,并且只能关闭访问我定位的文件的记事本进程。
然而,我注意到你的比较绝对不正确。
//not all processes have a string of 31 characters
//so sometimes it will trigger an exception
if (p.MainWindowTitle.Substring(0, 31) == "NotepadName.txt")
{
p.Kill();
}
出于您的目的,请替换为
if (p.MainWindowTitle.Contains("NotepadName.txt"))
{
p.Kill();
}
从我运行的测试中,这应该可行。
答案 3 :(得分:0)
有很多关于PID的问题,所以我必须为每个人都回答的问题写一个更清晰的答案(虽然这可能不是原始问题)。
因此,为了杀死第二个(按流程开始时间的顺序)流程完全填写示例中的条件,您应该写
var processToKill = (from p in Process.GetProcesses(".") where p.MainWindowTitle.Length > 0 and p.MainWindowTitle.Substring(0, 31) == "NotepadName.txt" order by p.StartTime).Skip(1).FirstOrDefault();
if(processToKill != null)
{
processToKill.Kill();
}