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-10-03 23:54:18

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

控制元素的点击执行事件只执行一次

if(e.handled !== true){ } e.handled=true; function(e) 完整例子: $('.shoucangtitlele').click(function(e){                if(e.handled !== true){                    var data = $(this).attr('data');                    alert(data);                    if(data

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

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

mfc 鼠标、键盘响应事件

一.基本目标 1.有一个基本的MFC程序,点击“关闭”则“关闭”这个程序,这点没什么好讲的,把自带的“取消”按钮,右键->属性的Caption改成“关闭”二字就可以了 2.鼠标在对话框中移动,则显示其位置信息,这个坐标是窗口内部坐标 3.如果按着鼠标右键移动鼠标,则在这个工程的标题栏会显示“按着鼠标右键移动鼠标”,松开鼠标右键回复如初 4.如果按着键盘上的Ctrl键或者Shift键在对话框的窗口中移动鼠标,标题栏同样会有相应的提示,是否同时按下也会有提示 5.左击对话框,会弹出对话框,显示鼠标位

winform批量更新数据_长时间的执行会导致界面卡死

原文:winform批量更新数据_长时间的执行会导致界面卡死 前言:使用winform触发一个事件后执行的代码,如果耗时非常长,则会导致窗口界面假死!  本人最近通过winform窗体执行一项:需要批量更新一批数据库的数据的操作的任务时,由于数据量达到百万级别,非常耗时,只能慢慢更新,慢慢执行. 但是,在执行的过程遇到了一个奇葩的问题:窗体在调试状态下,代码可以慢慢循环执行,没出现异常.  但是我单独运行EXE程序时,就必现:程序假死,未响应状态. 后台百度虽然没有找到直接的答案,但是也发现了原

MFC 程序入口和执行流程

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

DBA_命令nohup使用将耗时时间过长的脚本执行转入后台(案例)(时间较长的脚本后台运行防止Session断掉)

2014-08-08 BaoXinjian 一.摘要 nohup 命令运行由 Command参数和任何相关的 Arg参数指定的命令,忽略所有挂断(SIGHUP)信号. 在注销后使用 nohup 命令运行后台中的程序. 要运行后台中的 nohup 命令,添加 & ( 表示“and”的符号)到命令的尾部. 1. 重定向日志文件 如果不将 nohup 命令的输出重定向,输出将附加到当前目录的 nohup.out 文件中.如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohu

【转载】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