如何使用SetConsoleHandler()来阻止退出调用

Dac*_*cto 3 c# console exit

我知道setconsolehandler()如果我想管理控制台关闭事件,我必须使用.

我不知道如何阻止CTRL_CLOSE_EVENT.如果它捕获了那个事件,我已经尝试返回false/true,但没有成功

这是我到目前为止(感谢Anton Gogolev!)

[DllImport("Kernel32")]
public static extern bool SetConsoleCtrlHandler(HandlerRoutine Handler, bool Add);

public delegate bool HandlerRoutine(CtrlTypes CtrlType);

public enum CtrlTypes{
    CTRL_C_EVENT = 0,
    CTRL_BREAK_EVENT,
    CTRL_CLOSE_EVENT,
    CTRL_LOGOFF_EVENT = 5,
    CTRL_SHUTDOWN_EVENT
}

private static bool ConsoleCtrlCheck(CtrlTypes ctrlType)
{ 
    if(ctrlType == CtrlTypes.CTRL_CLOSE_EVENT)
        return false;// I have tried true and false and viceversa with the return   
                     // true/false but I cant seem to get it right.
    return true;
}


//and then I use this to call it
SetConsoleCtrlHandler(new HandlerRoutine(ConsoleCtrlCheck), true);
Run Code Online (Sandbox Code Playgroud)

还有可能运行一个新线程来监视控制台是否正在关闭,如果主线程正在做某事,阻止关闭?

Gre*_*ill 7

文档SetConsoleCtrlHandler()说:

当用户关闭控制台,注销或关闭系统时,系统会生成CTRL_CLOSE_EVENT,CTRL_LOGOFF_EVENT和CTRL_SHUTDOWN_EVENT信号,以便进程有机会在终止前清理.

这意味着与处理CTRL + C或CTRL + BREAK事件不同,您的进程无法取消关闭,注销或关闭.

  • @Greg Hewgill:是的,这是真的,当然如果用户真的想要关闭它,他们可以通过任务管理器这样做,但是如果程序正在下载文件(在用户请求下)会怎么样 - 关闭在中间只会给出一个部分文件. (2认同)