MFC键盘长按执行多次与执行一次

先说明一下你按下一个键盘不松开的时候发生了什么:产生了多个按下的消息,切消息的内容都一样,是你按下的那个键。

实现长按的时候执行多次:比如你长按“A”按钮,可以让界面上的某个控件的数值一直增大,那么你只要在实现这个按键的响应事件里增大一次就可以了,只要你长按,自动会多次调用你的这个函数。

实现长按的时候执行一次:这个按照网上的说法,可以添加一个静态变量,记录上次按了哪个键。主要的代码如下

(1)给类添加一个静态变量

private:

static WPARAM last_key;

(2)在源文件中初始化变量的值为一个非键盘的值以供第一次按键的时候响应

WPARAM CRobotClientDlg::last_key = -1;

(3)在响应按时按钮按下的时候判断是否第一次按下

if (WM_KEYDOWN == pMsg->message)

if(  pMsg->wParam == VK_LEFT && pMsg->wParam != last_key)

{

last_key = pMsg->wParam;

//doSomeThing

}

//松开控制键

if (WM_KEYUP == pMsg->message)

if( m_use_keyboard_contrl == true && pMsg->wParam == VK_LEFT )

{

last_key = -1;

//doSomeThing

}

注意,这里有几个BUG你可能会写到

(1)如果在松开按钮的时候没有回复last_key标记,那么你的要控制的键盘连续按多次的时候只能执行一次,因为这其间没有其他按键会改变last_key的值

(2)如果last_key设置为函数的静态变量,其实应该也可以,因为函数的静态变量只初始化一次,后面那句话就不执行了。

时间: 2024-08-28 22:08:34

MFC键盘长按执行多次与执行一次的相关文章

MFC长按键盘:执行多次、执行一次

先说明一下你按下一个键盘不松开的时候发生了什么:产生了多个按下的消息,切消息的内容都一样,是你按下的那个键. 实现长按的时候执行多次:比如你长按"A"按钮,可以让界面上的某个控件的数值一直增大,那么你只要在实现这个按键的响应事件里增大一次就可以了,只要你长按,自动会多次调用你的这个函数. 实现长按的时候执行一次:这个按照网上的说法,可以添加一个静态变量,记录上次按了哪个键.主要的代码如下 (1)给类添加一个静态变量 private: static WPARAM last_key; (2

设置定时任务为每天凌晨2点执行和每小时执行一次

每天凌晨2点  0 0 2 * * ?和每天隔一小时 0 * */1 * * ? 例1:每隔5秒执行一次:*/5 * * * * ? 例2:每隔5分执行一次:0 */5 * * * ? 在26分.29分.33分执行一次:0 26,29,33 * * * ? 例3:每天半夜12点30分执行一次:0 30 0 * * ? (注意日期域为0不是24) 每天凌晨1点执行一次:0 0 1 * * ? 每天上午10:15执行一次: 0 15 10 ? * * 或 0 15 10 * * ? 或 0 15 1

spring怎么设置定时任务为每天凌晨2点执行和每小时执行一次?

每天凌晨2点  0 0 2 * * ?和每天隔一小时 0 * */1 * * ? 例1:每隔5秒执行一次:*/5 * * * * ? 例2:每隔5分执行一次:0 */5 * * * ? 在26分.29分.33分执行一次:0 26,29,33 * * * ? 例3:每天半夜12点30分执行一次:0 30 0 * * ? (注意日期域为0不是24) 每天凌晨1点执行一次:0 0 1 * * ? 每天上午10:15执行一次: 0 15 10 ? * * 或 0 15 10 * * ? 或 0 15 1

MFC 程序入口和执行流程

一 MFC程序执行过程剖析 1)我们知道在WIN32API程序当中,程序的入口为WinMain函数,在这个函数当中我们完成注册窗口类,创建窗口,进入消息循环,最后由操作系统根据发送到程序窗口的消息调用程序的窗口函数.而在MFC程序当中我们不在能找到类似WinMain这样的程序入口,取而代之的是一系列派生类的声明和定义以及一个冲CWinApp类派生而来的类的全局对象.CWinApp类被称之为应用程序对象,在一个MFC程序当中只允许有一个应用程序对象.由于CWinApp的派生对象是全局的,因此这个对

【转载】MFC 程序入口和执行流程

原文链接: http://www.cnblogs.com/liuweilinlin/archive/2012/08/16/2643272.html 一 MFC程序执行过程剖析 1)我们知道在WIN32API程序当中,程序的入口为WinMain函数,在这个函数当中我们完成注册窗口类,创建窗口,进入消息循环,最后由操作系统根据发送到程序窗口的消息调用程序的窗口函数.而在MFC程序当中我们不在能找到类似WinMain这样的程序入口,取而代之的是一系列派生类的声明和定义以及一个冲CWinApp类派生而来

【转】MFC 程序入口和执行流程

一 MFC程序执行过程剖析 1)我们知道在WIN32API程序当中,程序的入口为WinMain函数,在这个函数当中我们完成注册窗口类,创建窗口,进入消息循环,最后由操作系统根据发送到程序窗口的消息调用程序的窗口函数.而在MFC程序当中我们不在能找到类似WinMain这样的程序入口,取而代之的是一系列派生类的声明和定义以及一个冲CWinApp类派生而来的类的全局对象.CWinApp类被称之为应用程序对象,在一个MFC程序当中只允许有一个应用程序对象.由于CWinApp的派生对象是全局的,因此这个对

MFC学习之程序执行过程梳理

*首先利用全局变量对象theApp启动应用程序.这是由于这个全局对象,基类CWinApp中this的指针才干指向这个对象.假设没有这个全局对象,程序在编译时不会出错,但在执行时就会出错. *调用全局应用程序对象的构造函数,从而就会先调用其基类CWinApp的构造函数.后者完毕应用程序的一些初始化工作,并将应用程序对象的指针保存起来. *进入WinMain函数.在AfxWinMain函数中能够获取子类(对Test程序来说就是CTestApp类)的指针,利用此指针调用虚函数:InitInstance

聊聊 键盘长按将解决卡顿方案

当我们做游戏的时候,很多时候遇用到键盘事件长按的的时候第一下卡顿的情况,怎么解决呢? 以下是我的解决方案,建议复制到编辑器上直接调试 代码里面有我思考的过程,大家可以参考 思考过程 //当按下的时候改变left属性值 40 //总结:当我们按下的时候,键盘的设计者不知道我们是要连续按还是按一下,所以,键盘的制造者定了一个规矩,如果按下超过..s的时候就认为是用户要连续按,于是就出现了一个问题,当我们玩游戏的时候,我们如果连续按下键盘就会先停顿一下,然后在连续的 41 //转化思想:如何解决这个问

问题解决——MFC Ribbon 响应函数 错乱 执行其他函数

==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完整性. 未经作者同意请勿修改(包括本声明),保留法律追究的权利. 未经作者同意请勿用于学术性引用. 未经作者同意请勿用于商业出版.商业印刷.商业引用.可洽谈. 本文不定期修正完善,为保证内容正确,建议移步原文处阅读. 本文链接:http://www.cnblogs.com/wlsandwho/p/4