C# code:
ProcessStartInfo processStartInfo = new ProcessStartInfo(); processStartInfo.Verb = "runas"; processStartInfo.FileName = fileNameToExecute; processStartInfo.Arguments = parameters; Process process = new Process(); processStartInfo.UseShellExecute = false; processStartInfo.CreateNoWindow = true; processStartInfo.RedirectStandardOutput = true; processStartInfo.RedirectStandardError = true; process.StartInfo = processStartInfo; process.Start(); process.WaitForExit(); process.Close();
I am calling a java.exe from C# windows application. java.exe is used to test some websites. Java using Selenium to test the webpages by opening default web browser. It will open 3 to 10 times browsers and test the test cases. I want to add stop button in C# application and when we click it then it should close java.exe as well as those opened browsers. How to do it?
I tried to get process names by using exe name like this
Process[] processName = Process.GetProcessesByName(fileName.Substring(0, fileName.LastIndexOf('.')));
But it is not working.
Advertisement
Answer
Process process = new Process(); processStartInfo.UseShellExecute = false; processStartInfo.CreateNoWindow = true; processStartInfo.RedirectStandardOutput = true; processStartInfo.RedirectStandardError = true; process.StartInfo = processStartInfo; process.Start(); javaExeProcessId = process.Id; //global variable process.WaitForExit(); process.Close();
Before starting a new process I have stored the processId in a global variable.
private static void KillProcessAndChildren(int pid)
{
// Cannot close 'system idle process'.
if (pid == 0)
{
return;
}
ManagementObjectSearcher searcher = new ManagementObjectSearcher
("Select * From Win32_Process Where ParentProcessID=" + pid);
ManagementObjectCollection moc = searcher.Get();
foreach (ManagementObject mo in moc)
{
KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
}
try
{
Process proc = Process.GetProcessById(pid);
proc.Kill();
}
catch (Exception ex)
{
// Process already exited.
}
}
I called KillProcessAndChildren(javaExeProcessId); to kill the current process and its child processes wherever required.