当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使用SetConsoleHandler()来阻止退出调用》经验,为你挑选了1个好方法。

我知道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);

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



1> Greg Hewgill..:

文档SetConsoleCtrlHandler()说:

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

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


@Greg Hewgill:是的,这是真的,当然如果用户真的想要关闭它,他们可以通过任务管理器这样做,但是如果程序正在下载文件(在用户请求下)会怎么样 - 关闭在中间只会给出一个部分文件.
推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有