#include <QDebug>
#include <QTime>
#ifdef Q_OS_WIN
#include <windows.h>
#define KEY_DOWN(VK_NONAME) ((GetAsyncKeyState(VK_NONAME) & 0x8000) ? 1:0)
#define KEY_STATE_0 0 // 按键状态
#define KEY_STATE_1 1 // 消抖
#define KEY_STATE_2 2 // 判断按键有效的种类
#define KEY_STATE_3 3 // 等待按键释放
/**
*@brief:判断鼠标单击事件、双击事件和长按事件
*@note:为了判断防止误触,30ms以下的单击事件不做处理
*@author:wangshuai
*@return:0 无效 1单击 3长按
*/
unsigned int key_driver(void)
{
static unsigned char key_state = 0;//在while里调用的话,要为static的
static unsigned int key_time = 0; // 按键计时变量,需要是static的
unsigned char key_press, key_return;
key_return = 0; // 清除 返回按键值
key_press = KEY_DOWN(VK_XBUTTON2); // 读取当前键值,1为按下左键
switch(key_state)
{
case KEY_STATE_0:
if(key_press) //如果有按键按下
{
key_time = 0; //计时清零
key_state = KEY_STATE_1;
}
break;
case KEY_STATE_1:
if(key_press)
{
key_time++; //*10ms
if(key_time>3) //30ms以下的事件不做处理
{
key_state = KEY_STATE_2;//不是误触,为有效的按键操作
}
}
else key_state = KEY_STATE_0;
break;
case KEY_STATE_2:
if(!key_press)
{
key_return = 1; //单击
key_state = KEY_STATE_0; // 返回 按键状态0,继续等待按键
}
else
{
key_time++;
if(key_time >= 200)
{
key_return = 10; //长按
key_state = KEY_STATE_3; //等待按键释放
}
}
break;
case KEY_STATE_3: //等待按键释放
if(!key_press)
{
key_state = KEY_STATE_0;//按键释放后,进入按键状态0,进行下一次按键的判定
}
break;
default:
key_state = KEY_STATE_0;
break;
}
return key_return;
}
void MiCheckBtn::run()
{
// while(1)
// {
// static QTime startTime= QTime::currentTime();
// static bool work = false;
// static bool isRight = false;
// int key_state = key_driver();
// switch (key_state) {//检测到单击事件
// case 1:
// {
// startTime = QTime::currentTime();
// qDebug()<<"单击";
// }
// break;
// default:
// break;
// }
// if(KEY_DOWN(VK_XBUTTON2))
// {
// QTime stopTime = QTime::currentTime();
// if(startTime.msecsTo(stopTime)<300 && !work)//双击
// {
// qDebug()<<startTime.msecsTo(stopTime);
// emit btn_click(false);
// work = true;
// isRight = false;
// }else if(!work){
// //
// qDebug()<<"翻译";
// emit btn_click(true);
// work = true;
// isRight = true;
// }
// }
// else if(!KEY_DOWN(VK_XBUTTON2))
// {
// if(isRight)
// {
// emit btn_release(true);
// work = false;
// }
// else{
// work = false;
// emit btn_release(false);
// isRight = false;
// }
// }
// Sleep(10);//这里是10ms扫描一次
// }
}
检测按键单双击状态
猜你喜欢
转载自blog.csdn.net/yonggandess/article/details/103976367
今日推荐
周排行