最近想做个代码助手, 想要快速唤醒, 除了鼠标移动到边缘唤醒之外,还应该有键盘呼出的方式, 从腾讯电脑管家的小火箭得到的灵感(双击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);
}