#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QDebug>
HHOOK keyHook=NULL;
HHOOK mouseHook=NULL;
//键盘钩子过程
LRESULT CALLBACK keyProc(int nCode,WPARAM wParam,LPARAM lParam )
{
bool forNext = true;
if(nCode == HC_ACTION)
{
forNext = MainWindow::getIns()->keyboardEvent(wParam, lParam);
}
//返回1表示截取消息不再传递,返回0表示不作处理,消息继续传递
return forNext ? 0 : 1;
}
//鼠标钩子过程
LRESULT CALLBACK mouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if(nCode == HC_ACTION) //当nCode等于HC_ACTION时,要求得到处理
{
MainWindow::getIns()->mouseEvent(wParam, lParam);
}
//鼠标不需要屏蔽
return 0;
}
MainWindow* MainWindow::_ins = NULL;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow* MainWindow::getIns(QWidget *parent)
{
if(MainWindow::_ins == NULL)
{
MainWindow::_ins = new MainWindow(parent);
}
return MainWindow::_ins;
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::enterEvent(QEvent *event)
{
//由于加载了钩子之后调试情况下程序反应极慢,所以只是在Release模式下使用钩子
#ifndef DEBUG
//底层键盘钩子
keyHook = SetWindowsHookEx(WH_KEYBOARD_LL, keyProc, GetModuleHandle(NULL), 0);
//底层鼠标钩子
mouseHook = SetWindowsHookEx(WH_MOUSE_LL, mouseProc, GetModuleHandle(NULL), 0);
#endif
}
void MainWindow::leaveEvent(QEvent *event)
{
//由于加载了钩子之后调试情况下程序反应极慢,所以只是在Release模式下使用钩子
#ifndef DEBUG
//卸载键盘钩子
UnhookWindowsHookEx(keyHook);
//卸载鼠标钩子
UnhookWindowsHookEx(mouseHook);
#endif
}
bool MainWindow::checkKeyboardEvent(WPARAM wParam, LPARAM lParam)
{
if(WM_KEYDOWN == wParam
|| WM_SYSKEYUP == wParam
|| WM_SYSKEYDOWN == wParam
|| WM_SYSKEYUP == wParam)
{
KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *)lParam;
if(pkbhs->vkCode == VK_LWIN || pkbhs->vkCode == VK_RWIN || pkbhs->vkCode == VK_TAB)
{
//屏蔽Win,Tab
return false;
}
if(pkbhs->vkCode == VK_TAB && pkbhs->flags & LLKHF_ALTDOWN != 0)
{
//屏蔽Alt+Tab
qDebug() << "Alt+Tab";
return false;
}
if(pkbhs->vkCode == VK_ESCAPE && pkbhs->flags & LLKHF_ALTDOWN != 0)
{
//屏蔽Alt+Esc
return false;
}
if(pkbhs->vkCode == VK_ESCAPE && GetKeyState(VK_CONTROL) & 0x8000 != 0)
{
//屏蔽Ctrl+Esc
return false;
}
if(pkbhs->vkCode == VK_F4 && pkbhs->flags & LLKHF_ALTDOWN != 0)
{
//屏蔽Alt+F4
return false;
}
if(pkbhs->vkCode == VK_F1)
{
//屏蔽F1
return false;
}
}
return true;
}
bool MainWindow::checkMouseEvent(WPARAM wParam, LPARAM lParam)
{
return true;
}
bool MainWindow::keyboardEvent(WPARAM wParam, LPARAM lParam)
{
//判断键盘按键状态和按键扫描码
KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *)lParam;
if(WM_KEYDOWN== wParam || WM_SYSKEYDOWN == wParam)
{
//LWIN:91,RWIN:92,MENU:93
qDebug() << "WM_KEYDOWN >>>> " << pkbhs->scanCode;
}
else if(WM_KEYUP == wParam || WM_SYSKEYUP == wParam)
{
qDebug() << "WM_KEYUP >>>> " << pkbhs->scanCode;
}
return this->checkKeyboardEvent(wParam, lParam);
}
bool MainWindow::mouseEvent(WPARAM wParam, LPARAM lParam)
{
MSLLHOOKSTRUCT *msbhs = (MSLLHOOKSTRUCT *)lParam;
if(wParam == WM_MOUSEMOVE)
{
//移动,全局鼠标坐标
qDebug() << "WM_MOUSEMOVE >>>> GOLBAL >>>> x: " << msbhs->pt.x << " y: " << msbhs->pt.y;
//移动,窗口内鼠标坐标
qDebug() << "WM_MOUSEMOVE >>>> WINDOW >>>> x: " << msbhs->pt.x - this->geometry().x() << " y: " << msbhs->pt.y - this->geometry().y();
}
else if(wParam == WM_LBUTTONDOWN)
{
//左键压下
qDebug() << "WM_LBUTTONDOWN >>>>";
}
else if(wParam == WM_LBUTTONUP)
{
//左键抬起
qDebug() << "WM_LBUTTONUP >>>>";
}
else if(wParam == WM_RBUTTONDOWN)
{
//右键压下
qDebug() << "WM_RBUTTONDOWN >>>>";
}
else if(wParam == WM_RBUTTONUP)
{
//右键抬起
qDebug() << "WM_RBUTTONUP >>>>";
}
else if(wParam == WM_MBUTTONDOWN)
{
//中键压下
qDebug() << "WM_MBUTTONDOWN >>>>";
}
else if(wParam == WM_MBUTTONUP)
{
//中键抬起
qDebug() << "WM_MBUTTONUP >>>>";
}
else if(wParam == WM_MOUSEWHEEL)
{
//鼠标滚轮滚动
short zDelta = (short)HIWORD(msbhs->mouseData); //获得-120或者120标记滚轮方向
qDebug() << "WM_MOUSEWHEEL >>>> " << zDelta;
}
return true;
}
Windows+QT利用用鼠标键盘钩子捕获得用户在窗口内的输入动作,完整代码,可以直接运行
需积分: 50 189 浏览量
2019-02-21
10:29:27
上传
评论 1
收藏 6KB ZIP 举报
cc279921792
- 粉丝: 6
- 资源: 40
最新资源
- base.apk
- Vue 结合 D3.js 进行数据可视化开发的练手案例.zip
- 语音模块使用说明_jr6001调试工具.html
- 毕业设计-reat18货物运输后台管理系统
- Qt tcp通信(exe)
- tensorflow-gpu-2.7.3-cp39-cp39-manylinux2010-x86-64.whl
- tensorflow-2.8.0-cp37-cp37m-manylinux2010-x86-64.whl
- tensorflow-2.7.4-cp39-cp39-manylinux2010-x86-64.whl
- HTML后台管理系统源49套合集 H5模板源码下载 总有一款适合你 静态页面
- DDColor-PDF文献
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈