我想在Windows上的外部控制台应用程序中禁用 Ctrl + C 默认操作(停止/关闭/终止)。我读过有关“SetConsoleCtrlHandler
”和“Console.TreatCtrlCAsInput
”的内容,但它们似乎都不适用于外部流程。
还有其他选择吗?我是否忽略了一些可以使用一些丢弃选项的细节?
我对这个应用程序的想法是成为一个非交互式应用程序,并从控制台应用程序(cmd.exe / cscript.exe /等)作为子应用程序打开。并且它也关闭父母关闭过程以关闭自己。
这就是我现在所拥有的:
using System.Threading; //Thread
using System.Runtime.InteropServices; //DllImport
// A delegate type to be used as the handler routine for SetConsoleCtrlHandler.
public delegate bool HandlerRoutine(CtrlTypes CtrlType);
// An enumerated type for the control messages sent to the handler routine.
public enum CtrlTypes {
CTRL_C_EVENT = 0,
CTRL_BREAK_EVENT = 1,
CTRL_CLOSE_EVENT = 2,
CTRL_LOGOFF_EVENT = 5,
CTRL_SHUTDOWN_EVENT = 6
}
public class all {
[DllImport("Kernel32")] public static extern bool SetConsoleCtrlHandler(HandlerRoutine Handler, bool Add);
[DllImport("kernel32.dll", SetLastError = true)]
static extern bool AttachConsole(uint dwProcessId);
[DllImport("kernel32.dll", SetLastError=true, ExactSpelling=true)]
static extern bool FreeConsole();
/*
//Maybe I will need GetConsoleWindow after.
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();
*/
private static bool ConsoleCtrlCheck(CtrlTypes ctrlType) {
// Put your own handler here
return true;
}
private void WaitThread(int mls) {
Thread.Sleep(mls);
}
static void Main() {
const uint ATTACH_PARENT_PROCESS = 0x0ffffffff;
Thread waitThread;
//System.Console.WriteLine("!");
//AttachConsole(ATTACH_PARENT_PROCESS);
AttachConsole(ATTACH_PARENT_PROCESS);
SetConsoleCtrlHandler(new HandlerRoutine(ConsoleCtrlCheck), true);
while(true) {
waitThread = new Thread(() => WaitThread(100));
waitThread.Start();
waitThread.Join();
}
// Next lines are ignored. I will close the process manually while it's in WIP(Work In Progress) phase.
CloseApp();
}
static void CloseApp() {
FreeConsole();
System.Environment.Exit(0);
}
}
我在这里找到了“睡眠例程”:http://bresleveloper.blogspot.com/2012/05/console-applicationdoevents-solved.html
我收到错误:
(49,29):错误CS1525:Eltérminodelaexpresión')'noesválido
(49,32):错误CS1525:Eltérminodelaexpresión'>'没有esválido
(49,34):错误CS1026:Se esperaba)(49,49):错误CS1002:Se esperaba;
(49,49):错误CS1525:Eltérminodelaexpresión')'noesválido
第49行是“while(true)”中的第一个。 我是C#的新手,请考虑一下。
答案 0 :(得分:1)
如果外部控制台应用程序不是您编写的程序,则可以通过全局键盘挂钩来处理它。