一个HandlerRoutine函数是控制台进程指定的一个函数来处理进程接收到的控制信号。该函数可以有任何名称。
BOOL HandlerRoutine(
DWORD 【dwCtrlType】 | //控制信号类型 |
); |
参数
【dwCtrlType】
指示处理程序接收到的控制信号的类型。此值为以下之一:
信号 | 描述 |
CTRL_C_EVENT | 从键盘输入或由GenerateConsoleCtrlEvent功能生成的信号接收到CTRL + C信号。 |
CTRL_BREAK_EVENT | 接收到CTRL + BREAK信号,无论是从键盘输入还是从GenerateConsoleCtrlEvent生成的信号。 |
CTRL_CLOSE_EVENT | 当用户关闭控制台时(通过从控制台窗口的“系统”菜单中选择“关闭”命令,或从“任务列表”中选择“结束任务”命令),系统将发送给连接到控制台的所有进程的信号。 |
CTRL_LOGOFF_EVENT | 系统在用户注销时发送到所有控制台进程的信号。该信号不指示哪个用户正在注销,因此不能做任何假设。 |
CTRL_SHUTDOWN_EVENT | 当系统关闭时系统发送到所有控制台进程的信号。 |
返回值
如果函数处理控制信号,它应该返回TRUE。如果返回FALSE,则使用该进程处理程序列表中的下一个处理函数。
备注
每个控制台进程都有自己的HandlerRoutine功能列表。最初,此列表仅包含调用ExitProcess的默认处理函数。控制台进程通过调用SetConsoleCtrlHandler函数来添加或删除其他处理函数,这不影响其他进程的处理函数列表。当控制台进程接收到任何控制信号时,其处理函数在最后注册的第一个基础上被调用,直到其中一个处理程序返回TRUE为止。如果处理程序没有返回TRUE,则调用默认处理程序。
CTRL_CLOSE_EVENT,CTRL_LOGOFF_EVENT和CTRL_SHUTDOWN_EVENT信号为进程提供了在终止前清理的机会。调用处理任何这些信号的HandlerRoutine可以在执行任何清除操作后执行以下操作之一:
*调用ExitProcess函数来终止进程。
*返回FALSE。如果没有注册的处理程序函数返回TRUE,则默认处理程序终止进程。
*返回TRUE。在这种情况下,不会调用其他处理函数,系统会显示弹出对话框,询问用户是否终止进程。如果进程在一定的超时时间内没有响应(CTRL_CLOSE_EVENT为5秒,CTRL_LOGOFF_EVENT和CTRL_SHUTDOWN_EVENT为20秒),系统还会显示该对话框。
一个进程可以使用SetProcessShutdownParameters函数来阻止CTRL_LOGOFF_EVENT和CTRL_SHUTDOWN_EVENT对话框的显示。在这种情况下,当HandlerRoutine返回TRUE或超时时间过去时,系统就会终止进程。
也可以看看
ExitProcess, GenerateConsoleCtrlEvent, GetProcessShutdownParameters, SetConsoleCtrlHandler, SetProcessShutdownParameters