Win32编程中如何与控制台互动
来源:互联网 发布:suse linux 设置网关 编辑:程序博客网 时间:2024/05/17 02:31
第一步,首先要安装一个事件钩子,也就是说要建立一个回调函数。调用Win32 API,原型如下:
BOOL SetConsoleCtrlHandler( PHANDLER_ROUTINE HandlerRoutine, // 回调函数 BOOL Add // 表示添加还是删除 );
参数 HandlerRoutine 是一个指向函数的指针,原型如下:
BOOL WINAPI HandlerRoutine( DWORD dwCtrlType // 控制事件类型 );
所有的HandlerRoutine函数只有一个参数 dwCtrlType,他表示控制台发出了什么消息。参数有下列值:
CTRL_C_EVENT - 当用户按下了 CTRL+C,或者由 GenerateConsoleCtrlEvent API 发出.
CTRL_BREAK_EVENT - 用户按下 CTRL+BREAK,或者由 GenerateConsoleCtrlEvent API 发出.
CTRL_CLOSE_EVENT - 当试图关闭控制台程序,系统发送关闭消息。
CTRL_LOGOFF_EVENT - 用户退出时,但是不能决定是哪个用户。
CTRL_SHUTDOWN_EVENT - 当系统被关闭时。
当收到事件的时候,HandlerRoutine可以选择处理,或者简单的忽略。如果回调函数选择忽略,函数返回FALSE,系统将处理下一个钩子程序。如果处理消息,程序在处理完消息后应该返回TRUE。
CTRL_CLOSE_EVENT,CTRL_LOGOFF_EVENT和CTRL_SHUTDOWN_EVENT 通常被用来处理一些程序的清理工作,然后调用 ExitProcess API。另外,这三个事件有超时机制,CTRL_CLOSE_EVENT 是5秒,另外两个是20秒。如果程序超时候,系统将会弹出结束进程的对话框。如果用户选择了结束进程,任何清理工作都不会做,所以应该在超时时间内完成工作。下面是一个回调函数的例子:
BOOL WINAPI ConsoleHandler(DWORD CEvent) { char mesg[128]; switch(CEvent) { case CTRL_C_EVENT: MessageBox(NULL, "CTRL+C received!", "CEvent", MB_OK); break; case CTRL_BREAK_EVENT: MessageBox(NULL, "CTRL+BREAK received!", "CEvent", MB_OK); break; case CTRL_CLOSE_EVENT: MessageBox(NULL, "Program being closed!","CEvent",MB_OK); break; case CTRL_LOGOFF_EVENT: MessageBox(NULL, "User is logging off!","CEvent",MB_OK); break; case CTRL_SHUTDOWN_EVENT: MessageBox(NULL, "User is logging off!", "CEvent", MB_OK); break; }}
好,现在已经有了回调函数,再来看看怎么安装钩子:
if( FALSE == SetConsoleCtrlHandler((PHANDLER_ROUTINE)ConsoleHandler, TRUE)){ // unable to install handler... // display message to the user printf( "Unable to install handler!\n" ); return -1;}
第一个参数是函数指针,就是上面的那个函数。第二个参数是标志,如果为TRUE那么就安装钩子,如果为FALSE那么删除钩子。
好了,在安装了钩子后,我们就能收到控制台消息了,在程序退出前,要删除钩子。很简单吧。
- Win32编程中如何与控制台互动
- Win32编程中如何处理控制台消息
- Win32编程中如何处理控制台消息
- Win32编程中如何处理控制台消息
- 如何在win32工程中使用控制台
- 如何在win32控制台应用程序中使用C++类库
- Win32控制台程序与Win32程序
- 如何在Win32 Console Application (Win32控制台)程序中使用MFC
- win32编程中如何使用MFC类
- Python与C++互动编程
- 如何隐藏win32控制台应用程序的窗口
- Win32控制台应用程序如何更换图标
- Win32控制台应用程序如何调用另一个.exe
- 如何在win32非控制台应用程序中使用iostream输出信息?
- 定时器SetTimer如何使用在win32控制台应用程序中(2)
- 0029控制台与win32项目的问题
- 在Win32应用程序中添加控制台窗口
- Win32应用程序中创建控制台窗口
- 虚拟机的网络配置方案
- OpenCV2马拉松第24圈——轮廓提取
- java-判断相同和对象比较大小
- 第八章作业
- JAVA 同步函数的错误实现
- Win32编程中如何与控制台互动
- Use Cases in an Agile Backlog
- 面向对象设计的设计原则
- hibernate 检索方式
- Centos6.3 JDK 和tomcat安装\配置
- adb shell 命令详解
- POJ 1094Sorting It All Out(拓扑排序)
- 黑马程序员_004控件的常用通用属性
- make命令详解