如何拦截 Console (控制台)窗口的关闭消息?
大神,请教个问题,困扰我很久。如何拦截Console(控制台)窗口的关闭消息?貌似Console窗口是Windows异化过的窗口,那个HandlerRoutine+CTR...
大神,请教个问题,困扰我很久。如何拦截 Console (控制台)窗口的关闭消息?貌似Console窗口是Windows异化过的窗口,那个HandlerRoutine+CTRL_CLOSE_EVENT的方法纯粹就是微软坑爹的玩意...
如解决我会专门发帖感谢! 展开
如解决我会专门发帖感谢! 展开
展开全部
windows的console有专门的函数:SetConsoleCtrlHandler(...),参考代码如下:
#include <iostream>
#include <windows.h>
using namespace std;
BOOL CtrlHandler( DWORD fdwCtrlType );
int main(int argc, char** argv)
{
if( SetConsoleCtrlHandler( (PHANDLER_ROUTINE) CtrlHandler, TRUE ) )
{
cout << "Control Handler is installed" << endl;
cout << " Ctrl+C, Ctrl+Break, logging off or closing console NOW intercepted." << endl;
cout << " ... into message loop.\n" << endl;
while( 1 ){ }
}
else
cout << "Control handler setting failed...." << endl;
return 0;
}
BOOL CtrlHandler( DWORD fdwCtrlType )
{
switch( fdwCtrlType )
{
case CTRL_C_EVENT:
printf( "Ctrl-C event\n\n" );
return( TRUE );
case CTRL_CLOSE_EVENT:
printf( "Ctrl-Close event\n\n" );
return( TRUE );
case CTRL_BREAK_EVENT:
printf( "Ctrl-Break event\n\n" );
return FALSE; // pass thru, let the system to handle the event.
case CTRL_LOGOFF_EVENT:
printf( "Ctrl-Logoff event\n\n" );
return FALSE; // pass thru, let the system to handle the event.
case CTRL_SHUTDOWN_EVENT:
printf( "Ctrl-Shutdown event\n\n" );
return FALSE; // pass thru, let the system to handle the event.
default:
return FALSE;
}
}
运行结果:
Control Handler is installed
Ctrl+C, Ctrl+Break, logging off or closing console NOW intercepted.
... into message loop.
Ctrl-C event
Ctrl-Break event
^C
更多追问追答
追问
非常感谢,但这个不行,拦截CTRL_CLOSE_EVENT的方法无法组织Console的关闭,所以说Windows异化过的Console窗口坑爹无极限。您再想想办法...
追答
可以截获的,但自Windows 7开始,m$的确修改了内部实现,只有5~10秒的时间留给你,之后就返回了。。。
NET的代码可以通过Microsoft.Win32.SystemEvent中的SessionEnding来达到控制的目的。c/c++的代码,有通过建立一个隐藏的window来间接实现控制的。
现在有事,等晚些时候再测试代码~,请继续追问,能继续回答~
来自:求助得到的回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询