如何在应用程序忙碌时探测用户的按健

这个问题在论坛中的出现频率很高。在解决这个问题时,首先要明确Windows处理用户输入的方法完全不同于Dos操作系统。当用户按键后,Dos应用向操作系统提出请求,而在Windows中,当用户事件发生时,是由Windows请求调用相应的代码,代码实现自己必须的处理,最后将控制返回到操作系统。

当你从Dos操作系统编程转向Windows的时候,你会很不习惯Windows的面向事件与消息的处理模式,但是面向对象的处理方法在Windows中非常灵活实用。

本文要讨论的问题是如何在应用程序中实现用户事件的轮询。例如,当你的应用程序在忙碌状态时,如何探测用户按键(Escape)来终止正在进行的处理或操作。

当用户按键或移动鼠标导致系统事件发生时,操作系统将这些事件存储在相应的应用程序消息队列中,事件会一直以消息的形式存储在消息队列中直到应用程序完消息并将控制返回到Windows,这时Windows将把消息队列中的下一条消息发送到应用程序。

所以,为了确定是否用户已经按下了某一个按键,应用程序需要确定某一按键的消息当前是否在消息队列中。为此可以调用PeekMessage函数,例如:

MSG msg;
// 检查是否按下Escape键
if (::PeekMessage(&msg, m_hWnd, WM_KEYFIRST,
WM_KEYLAST, PM_REMOVE)) {
if (msg.message == WM_KEYDOWN && msg.wParam
== VK_ESCAPE)
// 退出循环或者停止处理;
}

第一个参数MSG结构接收与消息有关的信息。第二个参数是window句柄,如果程序是基于MFC的应用,这个参数传递m_hWnd即可。下两个参数是确定类型的消息,PeekMessage将返回消息队列中落在这两个值之间的第一个消息。因为这里我们感兴趣的是按键,所以就用WM_KEYFIRST 和 WM_KEYLAST作为参数。最后一个参数可以是PM_NOREMOVE 或者 PM_REMOVE,表示消息信息是否应该从消息队列中删除。

如果PeekMessage在请求范围内寻找消息,他返回非零值。这样上面的代码检查是否发现WM_KEYDOWN消息并且wParam等于VK_ESCAPE,如果发现则退出循环并终止代码的处理。

时间: 2024-08-02 14:09:18

如何在应用程序忙碌时探测用户的按健的相关文章

web setup 如何判断程序已安装?卸载时提示用户是否要备份虚拟目录下的access db?

问题描述 websetup如何判断程序已安装?卸载时提示用户是否要备份虚拟目录下的accessdb?vs.net2005c#+access+asp.net我的打包程序想实现:1.判断是否已安装,如果已安装,用户要覆盖原来程序,提示是否备份数据库.2.卸载时提示用户是否要备份数据库?请大家给点思路,代码谢谢 解决方案 解决方案二:up解决方案三:?解决方案四:mark解决方案五:引用3楼begonia_ref的回复: mark

Windows2003在运行Sysprep时添加自定义用户设置

概要 本文介绍了Windows Server 2003如何在运行Sysprep实用程序(Sysprep.exe)时添加自定义的用户设置. 运行Sysprep.exe时,有些用户设置无法被捕获到.reg文件中并在安装程序完成时应用,而且也无法为这些设置编写脚本并将 它们应用于所有新用户.要解决此问题,请在运行Sysprep.exe之前将自定义的用户设置复制到"DefaultUser"配置文件. 要执行本节所描述的步骤,您的系统必须满足以下条件: Windows Server 2003要完

Win8安装UG9.0程序组件时安装出错怎么办

  在安装UG9.0程序软件时,安装出错,并提示:UGII_TMP_DIR 被设为一个有无效(非ASCII)字符的目录.怎么回事呢? 步骤如下: 一.原因分析: Win8帐户名肯定用的中文名,才会出现这此的问题,UG系统安装的时候有些目录会自动定义到你帐户名下的目录,而个目录中含有中文名,UG不识别,所以才会出错. 二.解决办法: 方法一:新建一个英文名用户再进行安装; 方法二: 1.在C盘新建一个TEMP名的文件夹; 2.然后打开环境变量(不知道哪里打开的话自己百度,这个是电脑基础知识),在用

服务器-客户端程序检测并记录用户执行了哪些操作,怎么实现呢?

问题描述 客户端程序检测并记录用户执行了哪些操作,怎么实现呢? 比如用户按下了Button1,Button2等等,那么全部记录下来形成操作日志. 怎样将记录下来的操作日志传给服务器,再由服务器存入数据库? 小弟大一初学者还请各位指点一下 谢谢! 解决方案 是自己的程序的话,重写PreTranslateMessage,记录下所有的事件.然后socket上传服务器 解决方案二: 按下button等事件都会调用submit,在服务器端调用对应action的函数时,在该函数的最前面加入insert语句,

android-Android 开发在程序退出时的操作应该放在哪处理

问题描述 Android 开发在程序退出时的操作应该放在哪处理 目前有个android项目,在apk退出时要做一些向网络上报数据,之前我是放在主activity的ondestroy方法里的,后来发现当用户按home键,之后apk被系统kill的时候,是不会调用ondestroy的,这样我的上报处理就不会做了.请问这种处理应该怎么做,别说放在onstop里,我有多个activity,主activity跳转的时候就会onstop了,我是想apk整个退出时做处理,谢谢! 解决方案 没找到可行的方案,系

工业程序-程序运行弹出用户定义断点窗口问题

问题描述 程序运行弹出用户定义断点窗口问题 我们公司的程序运行时弹出一个窗口.标题是Dms.HMI has encountered a user-defined breakpoint.不知道在程序哪个地方定义的断点.怎样取消掉.程序是用Visual Stidio 2005写的,Debug版本运行,Windows XP系统. 解决方案 估计是盗版软件破解不完全,程序中下了坑,触发int3中断. 解决方案二: 反正是公司用,该花钱花钱.就算不愿意花大钱,花个几万找个高手破解的好一些也没问题啊.

新手求助,,!!!winform程序调试老是 sa用户登陆失败!!!咋回事

问题描述 我的机子xpsp2我调试的winform程序是c#2.0+sql2000第一步调试用户登陆时提示:用户"sa"登陆失败详细信息:有关调用实时(JIT)调试而不是此对话框的详细信息,请参见此消息的结尾.**************异常文本**************System.Data.SqlClient.SqlException:用户'sa'登录失败.在System.Data.SqlClient.SqlInternalConnection.OnError(SqlExcept

Android程序启动时出现黑屏问题的解决方法_Android

本文实例讲述了Android程序启动时出现黑屏问题的解决方法.分享给大家供大家参考,具体如下: 关于黑屏: 默认的情况下,程序启动时,会有一个黑屏的时期,原因是,首个activity会加载一些数据,比如初始化列表数据.向服务器发送请求获取数据等等. 去除方法: 1.在style里面添加一个style: <style name="ContentOverlay"parent="@android:style/Theme.Light"> <itemname

Android程序启动时出现黑屏问题的解决方法

本文实例讲述了Android程序启动时出现黑屏问题的解决方法.分享给大家供大家参考,具体如下: 关于黑屏: 默认的情况下,程序启动时,会有一个黑屏的时期,原因是,首个activity会加载一些数据,比如初始化列表数据.向服务器发送请求获取数据等等. 去除方法: 1.在style里面添加一个style: <style name="ContentOverlay"parent="@android:style/Theme.Light"> <itemname