C# 是否可以取消Ctrl+;C另一进程中的默认操作';安慰

C# 是否可以取消Ctrl+;C另一进程中的默认操作';安慰,c#,windows,console,ctrl,C#,Windows,Console,Ctrl,我想在Windows上的外部控制台应用程序中禁用Ctrl+C默认操作(停止/关闭/终止)。我读过关于“SetConsoleCtrlHandler”和“Console.TreatCtrlCAsInput”的文章,但它们似乎都不适用于外部进程 有别的选择吗?我是否忽略了一些细节,而这些细节使得使用一些被丢弃的选项成为可能 我对这个应用程序的想法是成为一个非交互式应用程序,并从控制台应用程序(cmd.exe/cscript.exe/etc)作为子应用程序打开。它也会观察父进程的关闭过程 这就是我现在拥

我想在Windows上的外部控制台应用程序中禁用Ctrl+C默认操作(停止/关闭/终止)。我读过关于“
SetConsoleCtrlHandler
”和“
Console.TreatCtrlCAsInput
”的文章,但它们似乎都不适用于外部进程

有别的选择吗?我是否忽略了一些细节,而这些细节使得使用一些被丢弃的选项成为可能

我对这个应用程序的想法是成为一个非交互式应用程序,并从控制台应用程序(cmd.exe/cscript.exe/etc)作为子应用程序打开。它也会观察父进程的关闭过程

这就是我现在拥有的:

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);
    }
}
我在这里找到了“睡眠程序”:

我发现了一些错误:

(49,29):错误CS1525:El término de la expresión’“没有válido

(49,32):错误CS1525:El término de la expresión'>“没有válido

(49,34):错误CS1026:Se Esperata(49,49):错误CS1002:Se Esperata

(49,49):错误CS1525:El término de la expresión’“没有válido

第49行是“while(true)”中的第一行。
我对C是新手,请考虑这个问题。

< P>如果外部控制台应用程序不是你编写的程序,你可以通过全局键盘挂钩来处理它。 不,您的问题是操作系统特定的。如果您使用process类启动进程,您可以将IO重定向到您的程序。然后,您可以伪造一个控制台窗口,并从用户输入中过滤您想要的任何内容。否则,我真的不确定您想要做什么。我尝试过这个选项,但没有找到一种方法以正确的方式(异步)重定向输入。我发现的另一个问题是,拦截器例程没有正确地清除“屏幕”。请用一个具体的例子来回答您的一般问题,说明您正在尝试做什么。至少,我需要知道您是否正在创建外部流程,如果是,如何创建。有两种方法可以在子进程中禁用Ctrl+C,并且您不必为此连接到控制台。您可以传递创建标志
CREATE_NEW_PROCESS_GROUP
;默认情况下,新流程组已禁用Ctrl+C。CMD的
start
命令执行此操作。您还可以通过
SetConsoleCtrlHandle(NULL,TRUE)
在进程中禁用Ctrl+C,这将在子进程的进程参数中继承。不幸的是,“假控制台”方法通常不起作用。许多控制台应用程序不只是使用通用的
ReadFile
WriteFile
从标准I/O读写。它们使用控制台API(例如,
ReadConsole
ReadConsoleInput
PeekConsoleInput
writeconsoleioutput
,等等),如果启动时没有控制台或使用重定向到管道或文件的标准句柄,则很难出现故障。谢谢。这对我来说可能是有效的。例程必须检查窗口的类(必须是“ConsoleWindowClass”)。My exe将从控制台应用程序启动,因此它必须检查父进程,但该进程可能不是创建控制台窗口的进程)。如果我在cmd中打开cmd,然后打开我的应用程序。。。这可能是错误的。。。我想我可以打开另一条线索来质疑这一点。