如何拦截 Console (控制台)窗口的关闭消息?

大神,请教个问题,困扰我很久。如何拦截Console(控制台)窗口的关闭消息?貌似Console窗口是Windows异化过的窗口,那个HandlerRoutine+CTR... 大神,请教个问题,困扰我很久。如何拦截 Console (控制台)窗口的关闭消息?貌似Console窗口是Windows异化过的窗口,那个HandlerRoutine+CTRL_CLOSE_EVENT的方法纯粹就是微软坑爹的玩意...
如解决我会专门发帖感谢!
展开
 我来答
splashchaos
2014-12-26 · TA获得超过1.1万个赞
知道大有可为答主
回答量:3342
采纳率:0%
帮助的人:3615万
展开全部

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来间接实现控制的。

现在有事,等晚些时候再测试代码~,请继续追问,能继续回答~
来自:求助得到的回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式