QT在windows平台的全局热键(功能键双击效果)

 

最近想做个代码助手, 想要快速唤醒, 除了鼠标移动到边缘唤醒之外,还应该有键盘呼出的方式, 从腾讯电脑管家的小火箭得到的灵感(双击alt加速)。  因此在windows平台实现了如下功能

效果:程序运行起来之后, 无论窗口是否在前台显示,连按2下ctrl键, 会把窗口弹出, 再次按2次ctrl键,窗口最小化

 

widget.h 文件

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <windows.h>
#pragma execution_character_set("utf-8")
namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = nullptr);
    ~Widget();

private slots:
    bool nativeEvent(const QByteArray &eventType, void *message, long *result);
private:
    Ui::Widget *ui;

    bool m_isActive;    //双击事件是否形成
    QTimer* m_timer;    //定时器
    ATOM m_atom;        //全局热键标识符
};

#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include <QCompleter>
#include <QSharedPointer>
#include <QListWidget>
#include <QScrollBar>
#include <QDebug>
#include <windows.h>
#include <QTimer>

#pragma execution_character_set("utf-8")
#pragma comment(lib,"User32.lib")
Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    m_isActive = false;
    m_timer = new QTimer;
    connect( m_timer, &QTimer::timeout, this, [this](){ m_isActive=false; } );


    m_atom = GlobalAddAtomA("testAtom");   //创建原子数据, 避免重复
    RegisterHotKey( (HWND)this->winId(), m_atom, MOD_CONTROL, 0 );   //只注册CTRL键
}

Widget::~Widget()
{
    GlobalDeleteAtom( m_atom );
    delete ui;
}


bool Widget::nativeEvent(const QByteArray &eventType, void *message, long *result)          //按键事件最终会反馈到这里
{
    if( eventType == "windows_generic_MSG" )
    {
        MSG* msg = reinterpret_cast<MSG*>(message);
        if( msg->message == WM_HOTKEY )
        {
            if( m_isActive )   //如果此时标志位为true, 说明上次按下ctrl的时间在300毫秒以内,达成双击要求
            {

                if( this->isMinimized() )
                {
                    qDebug() << "双击了ctrl 把窗口显示出来";
                    this->showNormal();

                }
                else
                {
                    qDebug() << "双击了ctrl 隐藏窗口";
                    this->showMinimized();
                }

            }



            if( m_timer->isActive() )  //避免重复启动定时器
            {
                m_timer->stop();
            }

            m_timer->start(300);
            m_isActive = true;     //标志位设置为true
        }
    }

    return QWidget::nativeEvent(eventType, message, result);
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值