Win32编程中如何处理控制台消息
这篇文章讨论如何处理所有的控制台消息。
第一步,首先要安装一个事件钩子,也就是说要建立一个回调函数。调用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) switch(CEvent) } |
好,现在已经有了回调函数,再来看看怎么安装钩子:
| if (SetConsoleCtrlHandler( (PHANDLER_ROUTINE)ConsoleHandler,TRUE)==FALSE) { // unable to install handler... // display message to the user printf("Unable to install handler!\n"); return -1; } |
第一个参数是函数指针,就是上面的那个函数。第二个参数是标志,如果为TRUE那么就安装钩子,如果为FALSE那么删除钩子。
好了,在安装了钩子后,我们就能收到控制台消息了,在程序退出前,要删除钩子。很简单吧。
Win32编程中如何处理控制台消息的更多相关文章
- win32编程中消息循环和WndProc()窗口过程函数
原文地址:https://blog.csdn.net/zxxSsdsd/article/details/45504383 在win32程序的消息循环函数中 while (GetMessage (&a ...
- F12 开发人员工具中的控制台错误消息
使用此参考解释显示在 Internet Explorer 11 的控制台 和调试程序中的错误消息. 简介 使用 F12 开发人员工具进行调试时,错误消息(例如 EC7111 或 HTML1114)将显 ...
- win32 C++制作美观按钮,告别win32 API编程中默认的灰色按钮
使用win32 API制作美观按钮,当鼠标移入/移出按钮时改变按钮背景颜色,类似HTML网页中的效果,告别win32 API编程中默认的灰色按钮,效果图见下面动图和视频. 下载地址: 按钮效果(win ...
- SetConsoleCtrlHandler 处理控制台消息
转载自csdn:http://blog.csdn.net/zhongguoren666/article/details/8770615 SetConsoleCtrlHandler 处理控制台消息 ...
- Windows编程中的若干难点 - Windows程序设计(SDK)007
Windows编程中的若干难点 让编程改变世界 Change the world by program 一个窗口的生与死 我记得有童鞋会问:如果我的程序需要在关闭前让用户判断是否确定要关闭窗口,我应该 ...
- PHP编程中10个最常见的错误
PHP是一种非常流行的开源服务器端脚本语言,你在万维网看到的大多数网站都是使用php开发的.本篇经将为大家介绍PHP开发中10个最常见的问题,希望能够对朋友有所帮助. 错误1:foreach循环后留下 ...
- win32编程简介
win32编程简介 复习Win32整理下知识. 为什么学习win32? 我们要编写windos程序.都离不开API. 也就是我们所说的win32程序. 所以学好win32是你能不能再windows下编 ...
- 【WIN32编程】利用汇编写cs1.6辅助
这篇文章本来在2018.5.1号就写完发圈子去了,这两天跟朋友在网吧打单击才想起来,就顺便把内容发上去把 作者:admin-神风 用CE找到功能的地址 CS1.6下载地址:https://pan.ba ...
- win32 汇编学习(2):消息框
这一次,我们将用汇编语言写一个 Windows 程序,程序运行时将弹出一个消息框并显示"你好,我的第一个Win32汇编程序". 理论知识 Windows 为编写应用程序提供了大量的 ...
随机推荐
- Javascript-- jQuery Ajax应用
使用ajax()方法加载服务器数据 使用ajax()方法是最底层.功能最强大的请求服务器数据的方法,它不仅可以获取服务器返回的数据,还能向服务器发送请求并传递数值,它的调用格式如下: jQuery.a ...
- skynet coroutine 运行笔记
阅读云大的博客以及网上关于 skynet 的文章,总是会谈服务与消息.不怎么看得懂代码,光读这些文字真的很空洞,不明白说啥.网络的力量是伟大的,相信总能找到一些解决自己疑惑的文章.然后找到了这篇讲解 ...
- php 利用header 函数 下载各种文件
http://www.php.net/manual/en/function.readfile.php <?php /** * 下载文件 * header函数 * */ dl_file($_GET ...
- wordpress 自定义删除后台管理菜单
<?php /* //wordpress共有5种角色:administrator(管理员) editor(编辑) author(作者) contributor(投稿者) subscriber(订 ...
- BZOJ5091: [Lydsy1711月赛]摘苹果
BZOJ5091: [Lydsy1711月赛]摘苹果 https://lydsy.com/JudgeOnline/problem.php?id=5091 分析: 点\(x\)第\(1\)次选中的概率是 ...
- docker registry 镜像删除
registry:2.5.0版本的镜像,将镜像默认存放在了/var/lib/registry 目录下 /var/lib/registry/docker/registry/v2/repositories ...
- redis client API-----------python
想知道redis针对各种编程语言推荐的接口API实现,请参考http://redis.io/clients/ 选择python语言,则使用https://github.com/andymccurdy/ ...
- 【转】 Pro Android学习笔记(八七):了解Handler(1):组件和线程
目录(?)[-] 主线程消息队列和线程池 查看线程信息 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingf ...
- CSS-MUI:笔记-01
ylbtech-CSS-MUI:笔记 1. mui-navbar 导航条返回顶部 1.1.样式一 1.2. <div class="mui-navbar-inner mui-bar ...
- win10/server2019 系统安装 详解
https://www.microsoft.com/zh-cn/software-download/windows10 https://go.microsoft.com/fwlink/?LinkId= ...