如何根据handle判断一个程序是控制台程序还是win32程序? ( 积分: 200 )

  • 主题发起人 主题发起人 meteor007
  • 开始时间 开始时间
控制台程序有handle吗?
 
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;


这个函数把指定的信号传递给与调用进程相关联的控制台窗口。所有其它同组的程序都会收到这个信号。这可以用来实现一个父进程同时控制多个子进程的行为。
-----------------------------------------------------------------------------
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2308342
 
后退
顶部