반응형
// process가 이미 종료되었는지 확인후 process가 살아 있을경우 CloseMainWindows,kill작업 시작
// 실행한 프로세스 정상종료(CloseMainWindow())를 하고난뒤에도 process가 살아 있을경우
// 강제 kill
public void KillProcess(int pid)
{
try
{
ManagementObjectSearcher procSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_Process WHERE ParentProcessID=" + pid);
if (procSearcher.Get().Count > 0) {
Process proc = Process.GetProcessById(pid);
proc.CloseMainWindow();
proc.WaitForExit(100);
if (!proc.HasExited)
{
proc.Kill();
proc.WaitForExit();
}
}
}
catch (ArgumentException ex)
{
throw ex;
}
}
// 정확히 알고 있는 pid 프로세스만 kill
public void KillProcess(int pid)
{
try
{
Process proc = Process.GetProcessById(pid);
if (!proc.HasExited) proc.Kill();
}
catch (ArgumentException ex)
{
throw ex;
}
}
// 재귀함수를 이용해서 자식프로세스까지 kill
public void KillProcessChild(int pid)
{
ManagementObjectSearcher processSearcher = new ManagementObjectSearcher("SELECT * FROM Win32_Process WHERE ParentProcessID=" + pid);
ManagementObjectCollection processCollection = processSearcher.Get();
try
{
Process proc = Process.GetProcessById(pid);
if (!proc.HasExited) proc.Kill();
}
catch (ArgumentException ex)
{
throw ex;
}
if (processCollection != null)
{
foreach (ManagementObject mo in processCollection)
{
KillProcessChild(Convert.ToInt32(mo["ProcessID"]));
}
}
}
// 프로세스 전체 검색... 해서 kill 그다지 썩~
public void KillProcessSearch(int pid)
{
Process[] processes = Process.GetProcesses();
foreach (Process proc in processes)
{
if (proc.Id == pid)
{
proc.Kill();
break;
}
}
}
'Windows' 카테고리의 다른 글
[C#] 근사값 구하기 (0) | 2022.02.06 |
---|---|
c# 특정시간 기준으로 간격으로 두고 두번 실행하는 방법 (0) | 2021.12.17 |
C# parent & child process PID 찾기 (0) | 2021.12.16 |
ARP Scan Console (0) | 2021.04.03 |
Color Property (0) | 2021.04.03 |