检测按键单双击状态


#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扫描一次
    //    }
}
发布了24 篇原创文章 · 获赞 8 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/yonggandess/article/details/103976367