本文主要实现的软件功能是,双击运行软件之后,没有任何反应,也没有任何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();
}