从c#发送CTRL_C/SIGINT到进程
本文关键字:SIGINT 进程 发送 CTRL | 更新日期: 2023-09-27 18:01:49
我想中断通过cmd.exe运行的命令。在下面的代码中,我使用ping www.stackoverflow.com -t作为示例。
public void Run()
{
System.Diagnostics.ProcessStartInfo si = new System.Diagnostics.ProcessStartInfo("cmd.exe");
si.RedirectStandardInput = true;
si.RedirectStandardOutput = true;
si.RedirectStandardError = true;
si.UseShellExecute = false;
si.CreateNoWindow = false;
//si.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
System.Diagnostics.Process console = new Process();
console.StartInfo = si;
console.EnableRaisingEvents = true;
console.OutputDataReceived += proc_OutputDataReceived;
console.ErrorDataReceived += proc_ErrorDataReceived;
console.Start();
console.BeginOutputReadLine();
console.BeginErrorReadLine();
console.StandardInput.WriteLine("ping www.stackoverflow.com -t");
Thread.Sleep(4000);
bool success = GenerateConsoleCtrlEvent((uint)0, (uint)console.SessionId);
if (!success)
{
MessageBox.Show("Error Code: " + Marshal.GetLastWin32Error().ToString());
}
char asdf = (char)0x3;
console.StandardInput.WriteLine(''x3');
console.StandardInput.WriteLine(asdf);
console.StandardInput.Write(asdf);
//console.StandardInput.Close();
console.StandardInput.WriteLine(@"exit");
console.WaitForExit();
}
来自GenerateConsoleCtrlEvent的错误码为6。
我已遵照下列指示:
我可以发送ctrl-C (SIGINT)到Windows上的应用程序吗?
http://pastebin.com/vQuWQD8F 如何发送密钥而不是字符到进程?
但是,我无法中断这个进程。
任何帮助都非常感谢,
在向应用程序发送密钥和其他消息时,这可能是一个非常常见的问题。请记住,如果要发送到的应用程序具有比您的程序更高的权限评估,则它通常不会成功发送密钥或消息。尝试在管理权限下运行程序。或者,如果通过Visual Studio进行调试,请在管理员权限下运行Visual Studio。
编辑:
看到这不是你的问题,你想看看使用这里记录的ServiceController
类。它允许比Process
更好的控制,并且强烈建议在这些情况下使用它来提高可靠性。我将保留我之前的答案,因为这是一个常见的问题,其他人可能会觉得有用。
这里有两个教程让你开始:
http://www.codeproject.com/Articles/31688/Using-the-ServiceController-in-C-to-stop-and-starthttp://www.c-sharpcorner.com/uploadfile/mahesh/servicecontroller-in-C-Sharp/
希望这对你有帮助!