我正在尝试在C#中创建一个Windows应用程序,其功能是当它运行时,除了它自己以外的所有进程都会被杀死。
我使用以下逻辑:
但有些过程不允许被杀死,access is denied
在这种情况下,将这些进程添加到例外列表。
但问题是这段代码会运行,并且在某些时候屏幕挂起并且应用程序关闭。
这是代码
Process[] processlist = Process.GetProcesses();
string[] recProc = { "winlogon", "VCSExpress", "media player.vshost","VCSExpress", "taskmgr", "smss", "csrss", "wininit", "csrss", "services",
"lsass", "lsm", "svchost", "winlogon", "WLTRYSVC", "wlanext", "conhost", "BCMWLTRY",
"AvastSvc", "spoolsv", "svchost", "AERTSr64", "btwdins", "NitroPDFDriverService", "NLSSRV32",
"QDLService2kDell", "dwm", "taskhost", "explorer", "RAVCpl64", "AvastUI", "SearchIndexer",
"wmpnetwk", "firefox", "bitlord", "IAStorDataMgrSvc", "LMS", "svchost","media player",
"UNS", "regsvr32", "Skype", "OSPPSVC", "audiodg", "NitroPDF", "chrome", "AAM Updates Notifier",
"mscorsvw", "media player.vshost", "WmiPrvSE", "conhost", "tasklist","regsvr32","RAVCpl64","idle","dwm","conhost"};
List<string> listOfprocess = new List<string>(recProc);
foreach(Process theprocess in processlist)
{
int recProclength = listOfprocess.Count;
int incrementor;
for (incrementor=0; incrementor < processlist.Length;incrementor++)
{
if (theprocess.ProcessName != listOfprocess[incrementor])
{
try {
theprocess.Kill();
}
catch(Win32Exception w){
listOfprocess.Add(theprocess.ProcessName);
incrementor = 0;
break;
}
}
}
}
答案 0 :(得分:2)
除了关于你为什么这样做的明显问题之外,你的逻辑中存在错误。
要想看到这个想象,你的机器上只运行了2个进程,比如explorer.exe和yourapp.exe。
考虑当您输入explorer.exe的foreach时会发生什么。在内部for循环中,您可以检查进程的名称(即资源管理器)是否与listOfprocess[0]
(=“winlogon”)匹配。所以if条件为真,你最终在该进程上调用Kill()
。这不是你想要的。
答案 1 :(得分:0)
如果它与列表中的任何项目匹配,您显然意味着允许该过程生效。但相反,如果列表中的任何项目不匹配,您就会将其删除。这是一个问题,因为如果它与第一个匹配,它将与第二个匹配,并且死亡。如果是与第一个不匹配,它就会死亡,没有机会看到是否有任何其他项目是匹配的。当然,你会杀死自己的进程。