解決策があります。
コンソール全体をラップするアプリケーションに何らかの理由で(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などのイベントを送信する必要がある場合)
Raymond Chen [http://blogs.msdn.com/b/oldnewthing/アーカイブ/ 2011/07/06/10183368.aspx) –
これは同じ問題ですが、解決策が見つからなかったようですね。 – Velcro