http://www.delphibbs.com/delphibbs/modifyl.asp?lid=2046412
网上转的资料
控制台控制句柄
研究控制台输入模式时,一个常常引起关注的元素是控制台的控制句柄。这个句柄是每当某个系统级动作发生、而且可能影响到控制台时,Windows调用的函数。当控制台创建后,Windows简单地调用ExitProcess来安置一个空句柄。要安置你自己的句柄,用以下API调用:
function SetConsoleCtrlHandler(HandlerRoutine: TFNHandlerRoutine; Add: BOOL): BOOL; stdcall;
HandlerRoutine是指向一个函数的指针。这个函数按stdcall调用,接受一个DWORD参数,返回布尔值。根据Add参数的不同值,把你的自定义函数增加到注册句柄列表中,或者从中移除它。在 Windows NT/2000下,可以把NULL作为一个HandlerRoutine增加或移除。这个特殊的句柄专为忽略[Ctrl][C]而设计。
一旦系统事件发生,句柄就以被注册的相反顺序调用。以下DWORD参数是你的句柄可能收到的事件列表:
* CTRL_C_EVENT 用户按下[Ctrl][C]。
* CTRL_BREAK_EVENT 用户按下[Ctrl][Break]。
* CTRL_CLOSE_EVENT 用户试图关闭控制台窗口。
* CTRL_LOGOFF_EVENT 用户试图从系统注销。
* CTRL_SHUTDOWN_EVENT 用户试图关闭计算机。
每个句柄都有机会获得系统事件,自行处理或者传给下一个句柄。如果确信控制句柄能成功处理事件,就返回True。这样一来,事件就不会继续传递。否则,应该返回False,好让事件传递给链条中的下一个句柄。
最后三个事件,关闭、注销和关机消息,根据函数结果的不同而有不同的外部表现。如果所有句柄函数返回False,则进程将在最后一个句柄完成后立即退出。但是,如果其中任何一个句柄函数返回True,Windows就会提示用户确认是否关闭进程。用户可以选择立即结束进程,也可以选择不关闭进程。而且,如果函数执行超时,Windows也会让用户自行选择关闭进程、取消关闭或者继续等待。
如果有几个应用程序关联到同一个控制台,那么,它们都会收到传递给控制台窗口的信号。它们中的任何一个都有机会进行消息处理。此外,也可以把多个控制台程序作为一个控制台进程租对待。用CreateProcess创建新控制台窗口时情形就是这样。如果没有指定CREATE_NEW_PROCESS_GROUP标志,则控制台进程的所有子进程都属于同一个组。这样,控制台程序就能用下面这个API把信号发送给一个指定的进程组。
function GenerateConsoleCtrlEvent(dwCtrlEvent: DWORD; dwProcessGroupId: DWORD): BOOL; stdcall;
这个函数把指定的信号传递给与调用进程相关联的控制台窗口。所有其它同组的程序都会收到这个信号。这可以用来实现一个父进程同时控制多个子进程的行为。
-----------------------------------------------------------------------------