【问题标题】:Sending CTRL+C to a process without killing my window将 CTRL+C 发送到进程而不杀死我的窗口
【发布时间】:2013-04-10 15:56:06
【问题描述】:

我有一个控制台应用程序,它产生一个“cmd mcast /recv... > somefile.txt”

(process.standardoutputstream 不能与 mcast 一起正常工作,如果您想对此问题做出贡献,请参阅 redirecting standard output, event is not raised

我需要向 mcast 发送一个 ctrl+c 并使用此代码:

   [DllImport("kernel32.dll")]
   static extern bool GenerateConsoleCtrlEvent(
   uint dwCtrlEvent,
   uint dwProcessGroupId);

    void start(string path)
    {
        currentProcess = new Process();
        currentProcess.StartInfo.FileName = @"C:\WINDOWS\system32\cmd.exe";
        currentProcess.StartInfo.Arguments = "/C " + "mcast /recv /grps:239.255.0.1 /dump:3"
                    + " > " + path;
        currentProcess.StartInfo.UseShellExecute = false;
        currentProcess.Start();
     }

     void Stop()
     {
        Process mcast = Process.GetProcessesByName("mcast")[0];
        GenerateConsoleCtrlEvent(0 /*CTRL_C_EVENT*/, (uint)mcast.SessionId);
      }

但是 mcast 与我的程序共享控制台,并且 mcast 的 sessionid 为零。所以我的程序也收到一个 CTRL+C 并终止(这真的不是我想要做的),有什么想法吗?

编辑:我的所有研究表明,不可能将 CTRL+C 事件发送到另一个进程。只能发送 WIN_CLOSE 事件,控制台进程会忽略这些事件

【问题讨论】:

  • 你能用Process.Kill()吗?
  • 不,我需要优雅地结束 mcast,否则我会丢失数据

标签: c# process cmd


【解决方案1】:

您可以尝试调用currentProcess.CloseMainWindow(),这应该会关闭 cmd.exe,并且希望 cmd 会正确关闭正在执行的应用程序。

【讨论】:

  • CloseMainWindow 被 cmd.exe 和 mcast.exe 完全忽略,但感谢您的想法
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
相关资源
最近更新 更多