将CTRL-C发送到进程 - 但不是结束它

时间:2017-04-02 22:50:41

标签: c# process

我正在控制一个像这样启动的控制台进程:

           AvrGdb = new Process();
        AvrGdb.StartInfo.CreateNoWindow = true;
        AvrGdb.StartInfo.UseShellExecute = false;
        AvrGdb.StartInfo.FileName = "avr-gdb.exe";
        AvrGdb.StartInfo.RedirectStandardOutput = true;
        AvrGdb.StartInfo.RedirectStandardInput = true;
        AvrGdb.StartInfo.RedirectStandardError = true;

我将短命令字符串发送到'命令行'并接收数据。但是,需要发送的命令之一是 CTRL + C 。这不会关闭进程,它会将其发送到单独的微控制器中控制调试器(该过程是avr micros的' avr-gdb'调试器)。

我已经尝试StandardInput.Write('\x3')StandardInput.Write(char.ConvertFromUtf32(3));都没有成功(即我写的过程没有反应)。

存在关于此主题的许多其他主题,但通常提问者实际上想要使用此命令结束该过程,因此建议采用其他方法。

我发现有一个回复有这个建议,我认为可能有用(使用导入的C ++' GenerateConsoleCtrlEvent()'):

         Process avrgdb = Process.GetProcessesByName("avr-gdb")[0];
         GenerateConsoleCtrlEvent(CTRL_C_EVENT, (uint)avrgdb.SessionId);

但它并没有 - 显然是会议纪要'需要是一个' processGroup' c#中无法访问(或不存在?),只能在C ++中访问。

如果我知道用C ++而不是C#重写我的整个过程交互会解决这个问题,那么我可能会尝试这样做,但这种方法涉及一个很大的学习曲线。还有其他想法吗?

1 个答案:

答案 0 :(得分:0)

我想我找到了一个解决方案(通过this post);有人编写了一个C ++应用程序“SendSignal”。这通常发送CTRL + Break但我修改了源并重新编译以发送CTRL + C.

启动第三个进程以从第一个进程控制第二个进程看起来很麻烦,但它确实有效。