c# - 从 C# 向进程发送 CTRL_C/SIGINT

标签 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?

但是,我无法中断进程。

非常感谢任何帮助,

最佳答案

在向应用程序发送 key 和其他一些消息时,这可能是一个非常常见的问题。请记住,如果您要发送给的应用程序的权限评估高于您的程序,它通常不会成功发送 key 或消息。尝试在管理权限下运行您的程序。或者,如果您通过 Visual Studio 进行调试,请在管理权限下运行 Visual Studio。

编辑:

既然这不是您的问题,您想看看使用记录在案的 ServiceControllerhere .它允许比 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/

希望对你有帮助!

关于c# - 从 C# 向进程发送 CTRL_C/SIGINT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15180956/

相关文章:

c++ - 如何将 String 传递给 const char * 从 VB.NET 到用 C++ 编程的 DLL

c# - 从 UWP C# 应用程序使用 pinvoke 调用 LoadLibrary

c# - 控制另一台计算机上的浏览器

Java 高亮显示和选择输入

c# - Assembly.GetCustomAttributes 仍然被认为是最佳方法吗?

java - Eclipse 控制台不显示输出

c++ - 尽管 "cin.get();"或系统 ("pause"控制台窗口不会停留在屏幕上)

c# - Getfield.SetValue 不起作用

c# - Windows 窗体 C#,返回字符串数组始终为空

c# - ObservableCollection 的网格 ObservableCollection 的网格