b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

使用QHook实现全局的鼠标和键盘消息挂钩

电脑杂谈  发布时间:2020-04-16 22:25:36  来源:网络整理

鼠标钩子_鼠标钩子 下载_鼠标键盘钩子

本文的作者林忠峰首次发表在《知乎》上,未经许可,严禁转载.

Qt本身不处理全局消息挂钩,因此我们经常使用全局鼠标和键盘挂钩来编写win32代码. 为此,有扩展QHook. 该扩展使用非常简单,仅使用三行代码,并且使用Qt信号和时隙机制传递消息. 代码样式与Qt完全相同. 它当前是由mingw 32位编译的(目前尚未安装msvc),有调试版本和发行版本,并且将来会继续更新,敬请期待.

林忠峰/ QHookgitee.com

图标

QHook是作为动态链接库提供的,因此您需要使用动态链接库,您可以参考我的文章:

林忠峰: Qt生成并使用动态链接库zhuanlan.zhihu.com

鼠标钩子_鼠标键盘钩子_鼠标钩子 下载

图标

创建一个窗口项目鼠标键盘钩子,并如上所述引入动态链接库,然后编写如下代码:

#include mainwindow.h
#include ui_mainwindow.h

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //创建QHook实例
    hook=QHook::install();
    //hook->setMouseBlockedState(true);//设置为true则会阻塞鼠标响应
    //当有鼠标消息时将会触发mouseSignal信号,调用mouseHandler槽函数
    connect(hook,SIGNAL(mouseSignal(int)),this,SLOT(mouseHandler(int)));
    //当有键盘消息时将会触发keySignal信号,调用keyHandler槽函数
    connect(hook,SIGNAL(keySignal(int)),this,SLOT(keyHandler(int)));
}
MainWindow::~MainWindow()
{
    //销毁QHook实例
    QHook::uninstall();
    delete ui;
}
void MainWindow::mouseHandler(int mouseCode)
{
    if(mouseCode==QHook::MOUSE_RBUTTON_DOWN)//判断鼠标右键是否按下
    {
        qDebug()<<鼠标右键被按下;
    }
}
void MainWindow::keyHandler(int keyCode)
{
    if(keyCode==QHook::KEY_TAB_DOWN)//判断TAB键是否按下
    {
        qDebug()<<TAB键被按下;
        //hook->setMouseBlockedState(false);//设置为false则不会阻塞鼠标响应
    }
}

我们可以看到您只需要实例化QHook对象,然后连接信号和插槽即可全局鼠标消息和键盘消息. 使用非常简单. 其中,分别使用setMouseBlockedState(布尔状态)和setKeyBlockedState(布尔状态). 要设置鼠标和键盘的阻止状态,如果为true,则鼠标和键盘的操作(例如单击或按下键)将不会产生任何响应,当然,程序仍然可以接收到该消息,但是例如,打开一个程序,双击该程序将没有任何响应,并且按一个键将没有任何响应,因为此时鼠标键盘处于阻塞状态鼠标键盘钩子,仅当调用上述两个函数并传递false时将解除此阻塞状态,鼠标和键盘的响应自然恢复.

我们在这里运行程序测试:

鼠标钩子_鼠标钩子 下载_鼠标键盘钩子

这是一个空窗口. 我们要测量的是全局消息挂钩,因此我们必须隐藏窗口以使其失去焦点,然后在资源管理器界面上多次按鼠标右键和TAB键.

这一次打开控制台时,您可以看到控制台中输出了多行信息,证明我们的鼠标和键盘全局挂钩可用,如图所示:

鼠标键盘钩子_鼠标钩子 下载_鼠标钩子

QHook不仅可以在窗口程序中使用,而且可以在控制台程序中使用,其使用方法与窗口程序中的使用方法完全相同. 首先,创建一个控制台项目,然后导入动态链接库,然后可以使用QHook,具体代码如下:

#include object.h
Object::Object(QObject *parent) : QObject(parent)
{
    hook=QHook::install();
    //hook->setMouseBlockedState(true);
    connect(hook,SIGNAL(mouseSignal(int)),this,SLOT(mouseHandler(int)));
    connect(hook,SIGNAL(keySignal(int)),this,SLOT(keyHandler(int)));
}
Object::~Object()
{
    QHook::uninstall();
}
void Object::mouseHandler(int mouseCode)
{
    if(mouseCode==QHook::MOUSE_RBUTTON_DOWN)
    {
        qDebug()<<鼠标右键被按下;
    }
}
void Object::keyHandler(int keyCode)
{
    if(keyCode==QHook::KEY_TAB_DOWN)
    {
        qDebug()<<TAB键被按下;
        //hook->setMouseBlockedState(false);
    }
}

为什么要创建一个Object对象?由于QHook使用信号和插槽机制,因此需要一个从QObject继承的对象. 您可以通过在主程序中创建Object的实例来使用QHook. 代码如下:

#include <QCoreApplication>
#include object.h
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    Object object;
    return a.exec();
}

接下来运行程序以查看效果:

鼠标钩子 下载_鼠标钩子_鼠标键盘钩子

为了验证它是否是全局消息挂钩,我们需要最小化控制台以使其失去焦点,然后多次单击鼠标右键和TAB键,这一次在桌面上单击鼠标右键并按TAB键:

打开控制台,发现所有生成的鼠标和键盘消息都已打印出:

显然,QHook在窗口程序和控制台程序中均有效. 它也非常易于使用,因此有兴趣的朋友可以使用它. 因为它仍处于早期版本,所以这里不可避免地会出现问题,它并不是特别全面,并且将来会不断更新和改进. 如有任何疑问,可以在Gitee上留言.


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-178079-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...