2011-08-10 12 views
1

Process.Kill()を使用すると、プロセスは強制終了されます。しかし、私はそれを終了したいと思います。CreateNoWindowフラグで作成されたコンソールプロセスにCtrl + Cシグナルを送信する方法

GenerateConsoleCtrlEvent(ConsoleCtrlEvent.CTRL_C, Process.Id) APIで試してみましたが、成功しませんでした。

FalseCreateNoWindowフラグを設定すると、キーボードからCtrl + Cを送信すると、プログラムには"Caught signal: 2; Terminating"と表示されます。したがって、終了するには "2"信号を待つ。

どうすればいいですか?

+0

Raymond Chen [http://blogs.msdn.com/b/oldnewthing/アーカイブ/ 2011/07/06/10183368.aspx) –

+0

これは同じ問題ですが、解決策が見つからなかったようですね。 – Velcro

答えて

1

解決策があります。

コンソール全体をラップするアプリケーションに何らかの理由で(Microsoftへの質問)コントロールコードを受け取れない場合でも、コンソールは引き続きこれらのイベントを受け取ることができます。どうやって?外部アプリから。 CommandExecutorは、プロセスの周りに私のねじ切りラッパーで、

ここ
public void SendConsoleEvent(ConsoleCtrlEvent ev) 
{ 
    if (!Running) 
     return; 

    try 
    { 
     String current_dir = System.Environment.CurrentDirectory; 
     String stopper = "cas.exe"; 
     String args = pr.Id + " " + (int)ev; 

     CommandExecutor ex = new CommandExecutor (null, null); 
     ex.Start (current_dir, stopper, args); 
     // sometimes stop prevent CAS do work. just throw cas and forget about 
     //Timer.DelayCall (TimeSpan.FromSeconds (10), ex.Stop); 
     //ex.Stop(); 
    } 
    catch (Exception e) 
    { 
     Log ("SendConsoleEvent: " + e.ToString()); 
    } 
} 

これはcas.exe

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Runtime.InteropServices; 

namespace ConsoleAppStopper 
{ 
    class cas 
    { 
     [STAThread] 
     static void Main(string[] args) 
     { 
      if (args.Length < 2) 
      { 
       Help(); 
       return; 
      } 
      int processId = int.Parse (args[0]); 
      ConsoleCtrlEvent CtrlEvent = (ConsoleCtrlEvent)int.Parse(args[1]); 

      FreeConsole(); 
      AttachConsole (processId); 
      GenerateConsoleCtrlEvent (CtrlEvent, 0); 
     } 

     static void Help() 
     { 
      Console.BackgroundColor = ConsoleColor.Black; 
      Console.ForegroundColor = ConsoleColor.DarkYellow; 
      Console.WriteLine ("Console Application Eventer(Stopper)"); 
      Console.ForegroundColor = ConsoleColor.White; 
      Console.WriteLine ("cas.exe ProcessId ControlEvent"); 
      Console.WriteLine ("Events:"); 
      Console.ForegroundColor = ConsoleColor.Green; 
      Console.WriteLine ("\tCTRL_C - 0"); 
      Console.WriteLine ("\tCTRL_BREAK - 1"); 
      Console.WriteLine ("\tCTRL_LOGOFF - 5"); 
      Console.ResetColor(); 
     } 

     public enum ConsoleCtrlEvent 
     { 
      CTRL_C = 0, // From wincom.h 
      CTRL_BREAK = 1, 
      CTRL_CLOSE = 2, 
      CTRL_LOGOFF = 5, 
      CTRL_SHUTDOWN = 6 
     } 
     [DllImport ("kernel32.dll")] 
     static extern bool GenerateConsoleCtrlEvent(ConsoleCtrlEvent sigevent, 
     int dwProcessGroupId); 

     [DllImport ("kernel32.dll")] 
     static extern bool FreeConsole(); 

     [DllImport ("kernel32.dll")] 
     static extern bool AttachConsole(int dwProcessId); 
    } 
} 

とその使用方法についてのコードです。 pr.IdはProcess Consoleを使用して以前に起動したIDです(CTRL_Cなどのイベントを送信する必要がある場合)

関連する問題