今天项目中要用钩子程序,结果网上原理讲的挺好,但是代码好多都不好用,总结一下方便日后使用。
简介:
Hook 技术又叫做钩子函数,在系统没有调用该函数之前,钩子程序就先捕获该消息,钩子函数先得到控制权,这时钩子函数既可以加工处理(改变)该函数的执行行为,还可以强制结束消息的传递。简单来说,就是把系统的程序拉出来变成我们自己执行代码片段。
过程:

  1. 创建(安装)钩子:SetWindowsHookEx
  2. 使用回调函数:KeybdProc MouseProc CallNextHookEx(使用完成后要用这个函数将钩子传给后面)
  3. 释放钩子:CallNextHookEx

参考链接:
https://www.cnblogs.com/fanling999/p/4592740.html
https://www.cnblogs.com/chyshx/p/12614148.html
https://www.jianshu.com/p/3382cc765b39

鼠标事件常用宏定义:
WM_MOUSEMOVE 0x0200
WM_LBUTTONDOWN 0x0201
WM_LBUTTONUP 0x0202
WM_LBUTTONDBLCLK 0x0203
WM_RBUTTONDOWN 0x0204
WM_RBUTTONUP 0x0205
WM_RBUTTONDBLCLK 0x0206
WM_MBUTTONDOWN 0x0207
WM_MBUTTONUP 0x0208
WM_MBUTTONDBLCLK 0x0209
WM_MOUSEWHEEL 0x020A

例子:

#include "TextQtUi.h"
#include <Windows.h>
#include <iostream>
#include <string>using namespace std;HHOOK g_hMouse;//鼠标钩子全局变量
HHOOK g_hKeyb;//键盘钩子全局变量int b = 0;
LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{b++;qDebug() << "KeybdProcb = " << b;//将消息向下一个钩子传递return CallNextHookEx(NULL, nCode, wParam, lParam);
}int a = 0;
LRESULT CALLBACK KeybdProc(int nCode, WPARAM wParam, LPARAM lParam)
{a++;KBDLLHOOKSTRUCT* pkbhs = (KBDLLHOOKSTRUCT*)lParam;if (nCode == HC_ACTION) {qDebug() << "KeybdProc a =  " << a;}//将消息向下一个钩子传递return CallNextHookEx(NULL, nCode, wParam, lParam);
}void SetHook() {//钩子的安装if (g_hKeyb == nullptr) {g_hKeyb = SetWindowsHookEx(WH_KEYBOARD_LL, KeybdProc, nullptr, 0);}if (g_hMouse == nullptr) {g_hMouse = SetWindowsHookEx(WH_MOUSE_LL, MouseProc, nullptr, 0);}
}void UnHook() {//卸载鼠标、键盘钩子if (g_hKeyb != nullptr){UnhookWindowsHookEx(g_hKeyb);g_hKeyb = nullptr;}if (g_hMouse != nullptr) {UnhookWindowsHookEx(g_hMouse);g_hMouse = nullptr;}
}TextQtUi::TextQtUi(QWidget* parent): QMainWindow(parent)
{ui.setupUi(this);connect(ui.pushButton, SIGNAL(clicked()), this, SLOT(createHook()));connect(ui.pushButton_2, SIGNAL(clicked()), this, SLOT(deleteHook()));
}void TextQtUi::createHook() {SetHook();
}void TextQtUi::deleteHook() {UnHook();
}

Hook鼠标和键盘的使用相关推荐

  1. 如何在C#中使用全局鼠标、键盘Hook

    今天,有个同事问我,怎样在C#中使用全局钩子?以前写的全局钩子都是用unmanaged C或C++写个DLL来实现,可大家都知道,C#是基于.Net Framework的,是managed,怎么实现全 ...

  2. 全局钩子(hook鼠标键盘消息)

    生成DLL文件,模块定义文件为: LIBRARY Hook EXPORTS SetHook @2 实现文件如下.其中g_hWnd为所有进程共享,并且绕过了系统对可写数据的写时复制机制,维护的是一份拷贝 ...

  3. .NET下如何拦截鼠标、键盘消息?Win32NET来帮你

    Win32NET是一个Win32API的.NET下封装的类库,包含: 1: 常用win32的API的net封装 2:鼠标.键盘.热键hook钩子模块, 3:模拟键盘输入文字(支持各种字符文字.不同语言 ...

  4. c# 禁用鼠标与键盘

    禁用鼠标与键盘有两种方法: 直接调用禁用API(缺点:按Ctrl+alt+delete,禁用会失效) ① 帮助类 public class BlockHelper{private static Log ...

  5. Selenium之鼠标和键盘操作及扩展

    概念 在使用 Selenium WebDriver 做自动化测试的时候,会经常模拟鼠标和键盘的一些行为.比如使用鼠标单击.双击.右击.拖拽等动作:或者键盘输入.快捷键使用.组合键使用等模拟键盘的操作. ...

  6. 首次使用计算机鼠标键盘不能用,解决方案:如何解决无法使用计算机鼠标和键盘的问题?如果启动后无法使用鼠标和键盘该怎么办?...

    键盘和鼠标,作为计算机用户的日常生活中最频繁的人机交互设备,在日常使用中出现故障的频率也很高.在生活中经常会出现各种键盘和鼠标故障,反应迟钝和其他现象,从而干扰用户的正常工作和生活.发生这种情况时,编 ...

  7. python监听鼠标事件_Python中使用PyHook监听鼠标和键盘事件实例

    Python 中使用 PyHook 监听鼠标和键盘事件实例 PyHook 是一个基于 Python 的"钩子"库,主要用于监 听当前电脑上鼠标和键盘的事件.这个库依赖于另一个 Py ...

  8. C# WPF 中用代码模拟鼠标和键盘的操作

    C# WPF 中用代码模拟鼠标和键盘的操作 原文:C# WPF 中用代码模拟鼠标和键盘的操作 原文地址 C#开发者都知道,在Winform开发中,SendKeys类提供的方法是很实用的.但是可惜的是, ...

  9. js进阶 12-8 如何知道鼠标和键盘当前操作的是哪个键

    js进阶 12-8 如何知道鼠标和键盘当前操作的是哪个键 一.总结 一句话总结:event.which属性. 1.如何获取事件发生的时间? timeStamp属性 event.timeStamp 属性 ...

最新文章

  1. Securing Session State
  2. 1027 Colors in Mars (20 分)_20行代码AC
  3. python无法安装pycurl_Python安装pycurl失败的解决方法
  4. 黑色响应式全屏滚动主页源码
  5. bzoj2208 [Jsoi2010]连通数
  6. 【es】Elasticsearch:inverted index,doc_values及source
  7. 手把手教你如何加入到github的开源世界!
  8. pwdx 查看进程启动时的工作目录
  9. Camera(2) camera i2c总线协议介绍
  10. 基于MATLAB函数mesh绘制由多张曲面围成的三维封闭曲面详解
  11. python判断两个矩形是否相交_使用Python判断线段是否与矩形相交
  12. 数学建模评价类方法02——层次分析法
  13. sqli-labs 前五关
  14. 锁定计算机后 360wifi,如何使360wifi关闭电脑后继续使?
  15. 佐治亚理工计算机科学录取,佐治亚理工学院计算机科学排名第4(2018年TFE美国排名)...
  16. php ascii过滤,php过滤ascii控制字符
  17. 不要随便借出你的帐号
  18. pe制作linux硬盘的镜像文件_如何快速生成PE ISO文件
  19. 逝者:Django贡献最多的核心开发者Malcolm Tredinnick
  20. 用 React+Redux+Immutable 做俄罗斯方块

热门文章

  1. 【面试 redis】【第十二篇】redis的相关面试问题【完结】
  2. 消息中间件 rabbitMQ
  3. Visual Studio Code 构建C/C++开发环境
  4. Git添加多个SSH key公钥
  5. 批量修改一张表格的多个sheet名
  6. 【转】ASP.NET ViewState详解
  7. proc文件系统探索 之 以数字命名的目录
  8. scjp考试准备 - 11 - 类型转换2
  9. 职业人应该“这山望着那山高”
  10. 找出N个无序数中第K大的数