Qt通过钩子实现点击键盘空格进行关机重启

本文介绍了如何使用C++和Qt开发一个简单的程序,通过Windows键盘钩子功能,当用户双击运行并按下空格键时,模拟系统关机并在10秒后重启。代码展示了钩子安装、注销以及接收并处理按键信号的过程。
摘要由CSDN通过智能技术生成

本文主要实现的软件功能是,双击运行软件之后,没有任何反应,也没有任何ui界面显示,当点击键盘空格按键之后,会弹出警告提示框“系统准备关机”,并于10秒钟后关闭电脑,进行重启。
可以写出来逗逗朋友,也可以在此代码上添加一些其它好玩的功能,十分有趣。

这里是钩子代码头文件

参考的是喵喵叫的猴这个博主钩子的代码

#ifndef HOOK_H
#define HOOK_H

#include <QObject>
#include <QDebug>
#include <windows.h>

class Hook : public QObject
{
    Q_OBJECT
public:
    Hook();
    enum Type
    {
        CHANGE,
        CHANGEBACK
    };
    void installHook();//安装钩子函数
    void unInstallHook();//删除钩子
    void sendSignal(Type type);
    Q_ENUM(Type)//注册枚举类型进元对象系统,否则无法将枚举类型作为信号参数传递
signals:
    void sendKeyType(Type);//发送按键监控信号

};

#endif // HOOK_H

这是钩子的源文件

#include "Hook.h"


static HHOOK keyHook=nullptr;//钩子对象
static Hook* hook;//Qt界面中调用Hook类的对象
LRESULT CALLBACK keyProc(int nCode,WPARAM wParam,LPARAM lParam){//钩子消息函数,系统消息队列信息会返回到该函数中
    KBDLLHOOKSTRUCT* pkbhs = (KBDLLHOOKSTRUCT*)lParam;//lParam用于判断按键类型
    if(wParam == WM_KEYDOWN){//wParam用于判断事件类型,当前为按键按下事件
        if(pkbhs->vkCode == 0x20){//按下空格事件
            hook->sendSignal(Hook::CHANGE);//安装钩子的对象发出按键监听信号
        }
    }
    return CallNextHookEx(keyHook,nCode,wParam,lParam);//继续原有的事件队列
}

Hook::Hook()
{

}

void Hook::installHook()
{
    keyHook = SetWindowsHookEx(WH_KEYBOARD_LL,keyProc,nullptr,0);
    hook = this;
}

void Hook::unInstallHook()
{
    UnhookWindowsHookEx(keyHook);
    keyHook = nullptr;
}

void Hook::sendSignal(Hook::Type type)
{
    emit sendKeyType(type);
}

##ui界面头文件
进行判断键盘按下的事件,并进行电脑关机重启。

#ifndef SHUTDOWN_H
#define SHUTDOWN_H

#include <QMainWindow>
#include "Hook.h"
#include <QProcess>
#include <QMetaType>
#include <QMessageBox>

namespace Ui {
class shutdown;
}

class shutdown : public QMainWindow
{
    Q_OBJECT

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

    void shutdownpc1();

private:
    Ui::shutdown *ui;
public:
    Hook hook;

public slots:
    void chenkType(Hook::Type);
};

#endif // SHUTDOWN_H

ui界面源文件

#include "shutdown.h"
#include "ui_shutdown.h"

shutdown::shutdown(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::shutdown)
{
    ui->setupUi(this);
    hook.installHook();
    qRegisterMetaType<Hook::Type>("Type");//为了信号中能传递自定义枚举类型,如果传递常规参数,可省略该行
    connect(&hook,SIGNAL(sendKeyType(Type)),this,SLOT(chenkType(Type)));
}

shutdown::~shutdown()
{
    delete ui;
    hook.unInstallHook();
}

void shutdown::shutdownpc1()
{
    QMessageBox box;
    box.warning(NULL,"正在入侵","系统准备关机");
    QProcess p;
    p.start("shutdown -r -t 10");//10s重启电脑
    p.start("shutdown -s -t 10");//10s关闭电脑
    p.waitForStarted();
    p.waitForFinished();
    qDebug()<<QString::fromLocal8Bit(p.readAllStandardOutput());
}

void shutdown::chenkType(Hook::Type type)
{
    switch (type) {
    case Hook::CHANGE:{
        shutdownpc1();
    }
        break;
    default:
        break;
    }

}

main.cpp函数

这是刚编辑的时候报错了,在类名前面加一个class就好了,然后注释掉ui界面显示的代码

#include "shutdown.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    class shutdown w;
    //w.show();

    return a.exec();
}
  • 12
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值