将CTRL_C / SIGINT发送到来自C#的进程

时间:2013-03-03 00:10:49

标签: c# console pinvoke

我想中断通过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。

我已按照以下说明进行操作:

  1. Can I send a ctrl-C (SIGINT) to an application on Windows?

  2. http://pastebin.com/vQuWQD8F

  3. How to send keys instead of characters to a process?

  4. 但是,我无法中断此过程。

    非常感谢任何帮助,

1 个答案:

答案 0 :(得分:0)

将密钥和其他消息发送到应用程序时,这可能是一个非常常见的问题。请记住,如果您要发送的应用程序具有比您的程序更高的权限评估,则通常不会成功发送密钥或消息。尝试在管理权限下运行程序。或者,如果您通过Visual Studio进行调试,请以管理员权限运行Visual Studio。

修改

看到这不是您的问题,您想要查看使用ServiceController类记录的here。它允许比Process更精细的控制,并且在这些情况下强烈建议可靠性。我会留下我之前的答案,因为这是其他人可能会发现有用的常见问题

以下是两个帮助您入门的教程:

http://www.codeproject.com/Articles/31688/Using-the-ServiceController-in-C-to-stop-and-start http://www.c-sharpcorner.com/uploadfile/mahesh/servicecontroller-in-C-Sharp/

希望这能帮到你!