是否可以在另一个进程的控制台中取消Ctrl + C默认操作?

时间:2018-02-10 23:21:19

标签: c# windows console ctrl

我想在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#的新手,请考虑一下。

1 个答案:

答案 0 :(得分:1)

如果外部控制台应用程序不是您编写的程序,则可以通过全局键盘挂钩来处理它。