Hook钩子攻略

VBA开发环境中实现鼠标滚轮驱动的完整解决方案 在现代办公自动化场景中,Visual Basic for Applications(VBA)作为Office套件的核心脚本引擎,广泛用于提升操作效率与界面交互性。然而,其集成开发环境(VBE)对硬件输入的支持极为有限,原生不支持鼠标滚轮事件捕获,导致开发者在浏览长代码文件时只能依赖滚动条或键盘方向键,严重影响编码流畅度。该限制源于VBE基于传统Windows消息循环的简化设计,未注册处理消息的回调逻辑。由于VBE为封闭系统,无法直接修改源码,因此必须借助系统级钩子(Hook)机制。 阅读详情

 一。写在最前
本文的内容只想以最通俗的语言说明钩子的使用方法,具体到钩子的详细介绍可以参照下面的网址:
http://www.microsoft.com/china/community/program/originalarticles/techdoc/hook.mspx
二。了解一下钩子
从字面上理解,钩子就是想钩住些东西,在程序里可以利用钩子提前处理些Windows消息。
例子:有一个Form,Form里有个TextBox,我们想让用户在TextBox里输入的时候,不管敲键盘的哪个键,TextBox里显示的始终为“A”,这时我们就可以利用钩子监听键盘消息,先往Windows的钩子链表中加入一个自己写的钩子监听键盘消息,只要一按下键盘就会产生一个键盘消息,我们的钩子在这个消息传到TextBox之前先截获它,让TextBox显示一个“A”,之后结束这个消息,这样TextBox得到的总是“A”。
消息截获顺序:既然是截获消息,总要有先有后,钩子是按加入到钩子链表的顺序决定消息截获顺序。就是说最后加入到链表的钩子最先得到消息。
截获范围:钩子分为线程钩子和全局钩子,线程钩子只能截获本线程的消息,全局钩子可以截获整个系统消息。我认为应该尽量使用线程钩子,全局钩子如果使用不当可能会影响到其他程序。
三。开始通俗
    这里就以上文提到的简单例子做个线程钩子。
第一步:声明API函数
使用钩子,需要使用WindowsAPI函数,所以要先声明这些API函数。
// 安装钩子
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, IntPtr hInstance, int threadId);
// 卸载钩子
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern bool UnhookWindowsHookEx(int idHook);
// 继续下一个钩子
[DllImport("user32.dll",CharSet=CharSet.Auto, CallingConvention=CallingConvention.StdCall)]
public static extern int CallNextHookEx(int idHook, int nCode, Int32 wParam, IntPtr lParam); 
// 取得当前线程编号
[DllImport("kernel32.dll")]
static extern int GetCurrentThreadId(); 
声明一下API函数,以后就可以直接调用了。
第二步:声明、定义。
public delegate int HookProc(int nCode, Int32 wParam, IntPtr lParam);
static int hKeyboardHook = 0; 
HookProc KeyboardHookProcedure;
先解释一下委托,钩子必须使用标准的钩子子程,钩子子程就是一段方法,就是处理上面例子中提到的让TextBox显示“A”的操作。
钩子子程必须按照HookProc(int nCode, Int32 wParam, IntPtr lParam)这种结构定义,三个参数会得到关于消息的数据。
当使用SetWindowsHookEx函数安装钩子成功后会返回钩子子程的句柄,hKeyboardHook变量记录返回的句柄,如果hKeyboardHook不为0则说明钩子安装成功。
第三步:写钩子子程
钩子子程就是钩子所要做的事情。
private int KeyboardHookProc(int nCode, Int32 wParam, IntPtr lParam)
{
    if (nCode >= 0)
    {
        textbox1.Text = “A”;
        return 1;
    }
    return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam); 
}
我们写一个方法,返回一个int值,包括三个参数。如上面给出的代码,符合钩子子程的标准。
nCode参数是钩子代码,钩子子程使用这个参数来确定任务,这个参数的值依赖于Hook类型。
wParam和lParam参数包含了消息信息,我们可以从中提取需要的信息。
方法的内容可以根据需要编写,我们需要TextBox显示“A”,那我们就写在这里。当钩子截获到消息后就会调用钩子子程,这段程序结束后才往下进行。截获的消息怎么处理就要看子程的返回值了,如果返回1,则结束消息,这个消息到此为止,不再传递。如果返回0或调用CallNextHookEx函数则消息出了这个钩子继续往下传递,也就是传给消息真正的接受者。

第四步:安装钩子、卸载钩子
准备工作都完成了,剩下的就是把钩子装入钩子链表。
我们可以写两个方法在程序中合适位置调用。代码如下:
// 安装钩子
public void HookStart()
{
    if(hMouseHook == 0)
    {
        // 创建HookProc实例
        MouseHookProcedure = new HookProc(MouseHookProc);
        // 设置线程钩子
        hMouseHook = SetWindowsHookEx( 2, KeyboardHookProcedure, IntPtr.Zero, 
                                     GetCurrentThreadId());
        // 如果设置钩子失败
        if(hMouseHook == 0 )    
        {
            HookStop();
            throw new Exception("SetWindowsHookEx failed.");
        }
    }
}
// 卸载钩子
public void HookStop()
{
    bool retKeyboard = true;
    if(hKeyboardHook != 0)
    {
        retKeyboard = UnhookWindowsHookEx(hKeyboardHook);
        hKeyboardHook = 0;
    } 
    if (!(retMouse && retKeyboard)) throw new Exception("UnhookWindowsHookEx 
                                                        failed.");
}
安装钩子和卸载钩子关键就是SetWindowsHookEx和UnhookWindowsHookEx方法。
SetWindowsHookEx (int idHook, HookProc lpfn, IntPtr hInstance, int threadId) 函数将钩子加入到钩子链表中,说明一下四个参数:
idHook 钩子类型,即确定钩子监听何种消息,上面的代码中设为2,即监听键盘消息并且是线程钩子,如果是全局钩子监听键盘消息应设为13,线程钩子监听鼠标消息设为7,全局钩子监听鼠标消息设为14。
lpfn 钩子子程的地址指针。如果dwThreadId参数为0 或是一个由别的进程创建的线程的标识,lpfn必须指向DLL中的钩子子程。 除此以外,lpfn可以指向当前进程的一段钩子子程代码。钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数。
hInstance应用程序实例的句柄。标识包含lpfn所指的子程的DLL。如果threadId 标识当前进程创建的一个线程,而且子程代码位于当前进程,hInstance必须为NULL。可以很简单的设定其为本应用程序的实例句柄。
threaded 与安装的钩子子程相关联的线程的标识符。如果为0,钩子子程与所有的线程关联,即为全局钩子。
上面代码中的SetWindowsHookEx方法安装的是线程钩子,用GetCurrentThreadId()函数得到当前的线程ID,钩子就只监听当前线程的键盘消息。
UnhookWindowsHookEx (int idHook) 函数用来卸载钩子,卸载钩子与加入钩子链表的顺序无关,并非后进先出。
四。节外生枝
       
安装全局钩子
上文使用的是线程钩子,如果要使用全局钩子在钩子的安装上略有不同。如下:
SetWindowsHookEx( 13,KeyboardHookProcedure, 
          Marshal.GetHINSTANCE(Assembly.GetExecutingAssembly().GetModules()[0]),0)
这条语句即定义全局钩子。
子程消息处理
       钩子子程可以得到两个关于消息信息的参数wPrama、lParam。怎么将这两个参数转成我们更容易理解的消息呢。
       对于鼠标消息,我们可以定义下面这个结构:
public struct MSG 
{ 
    public Point p; 
    public IntPtr HWnd;
    public uint wHitTestCode;
    public int dwExtraInfo;
}
       
对于键盘消息,我们可以定义下面这个结构:
public struct KeyMSG
{
    public int vkCode; 
    public int scanCode;
    public int flags; 
    public int time; 
    public int dwExtraInfo; 
}
然后我们可以在子程里用下面语句将lParam数据转换成MSG或KeyMSG结构数据
MSG m = (MSG) Marshal.PtrToStructure(lParam, typeof(MSG));
KeyMSG m = (KeyMSG) Marshal.PtrToStructure(lParam, typeof(KeyMSG));
       
这样可以更方便的得到鼠标消息或键盘消息的相关信息,例如p即为鼠标坐标,HWnd即为鼠标点击的控件的句柄,vkCode即为按键代码。
注:这条语句对于监听鼠标消息的线程钩子和全局钩子都可以使用,但对监听键盘消息的线程钩子使用会出错,目前在找原因。
       如果是监听键盘消息的线程钩子,我们可以根据lParam值的正负确定按键是按下还是抬起,根据wParam值确定是按下哪个键。
// 按下的键
Keys keyData = (Keys)wParam;
if(lParam.ToInt32() > 0)        
{
    // 键盘按下
}
if(lParam.ToInt32() < 0)        
{
    // 键盘抬起
}
       
如果是监听键盘消息的全局钩子,按键是按下还是抬起要根据wParam值确定。
wParam = = 0x100 // 键盘按下
wParam = = 0x101 // 键盘抬起

 

vb钩子函数记录键盘鼠标(已测试) 通过vb钩子函数捕捉window消息, 记录键盘鼠标的消息和数据, 再通过回调函数播放出来 立即下载

相关推荐

VB代码的Hook全局键盘钩子.rar

VB代码的Hook全局键盘钩子.rarVB代码的Hook全局键盘钩子.rar

VB6实现键盘鼠标全局Hook

(声明:魏滔序原创,转贴请注明出处。) 标准模块(mHook):Option ExplicitPrivate Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long)Private De

迈克揉索芙特 6397

常用 EXCEL宏脚本VBA(非常全面)

常用 EXCEL宏脚本VBA(非常全面) 对于写脚步处理数据有非常高的参考价值

vb底层开发之Hook(钩子)

原帖地址:http://hi.baidu.com/starwork/blog/item/6d989ed3b2cb2c35960a1638.htmlhook是WINDOWS提供的一种消息处理机制,它使得程序员可以使用子过程来监视系统消息,并在消息到达目标过程前得到处理。 下面将介绍WINNDOWS HOOKS并且说明如何在WINDOWS 程序中使用它。 关于HOOKS 使用HOOK 将会降低

VisionSpace的专栏 1397

模拟按键精灵(EXCEL+VBA)

主要的函数都放在KeyB_Mouse_sub模块中。代码无加密 2.6版更新:利用钩子改进了抓点方式(感谢小FISH给的范例),改进了定位图片坐标的函数,加入一些新的函数,如waitkey,详见说明。 表格说明:就是控制鼠标键盘的操作,批量输入数据用的。像按键精灵,只是这个跟EXCEL结合在一起用,可以方便利用EXCEL在数据分析与整理方面的强大功能。(编写方法与宏的编写一致,只是集成了一些函数与工具方便控制键盘与鼠标) 附属表格范例.rar 给大家示范一下是怎么用这个基础表的 这个基础表就是一些控制键盘与鼠标的函数集合及一些辅助设计的工具集合。真正要实现一些功能还是要自己看情况自行编写。 里面值得参考的代码:VBA如何利用WIN32 API控制键盘鼠标 VBA利用钩子(勾子)实现鼠标抓点功能等等

Ms VBA 鼠标滚轮钩子脚本

这是一个VBA脚本,可以应用于Excel, Word, Access等Ms系列产品中,脚本提供了hool钩子,以使可以在 listBox 或者 comboBox 控件中通过鼠标滚轮上下滚动候选项,提高了操作效率

[转载]Hook钩子攻略

一。写在最前 本文的内容只想以最通俗的语言说明钩子的使用方法,具体到钩子的详细介绍可以参照下面的网址:http://www.microsoft.com/china/community/program/originalarticles/techdoc/hook.mspx二。了解一下钩子从字面上理解,钩子就是想钩住些东西,在程序里可以利用钩子提前处理些Windows消息。例子:有一个Form,Form

csdboy的专栏 1232

VBA设置工程不可查看(加密与解除).xlsm

VBA设置工程不可查看(加密与解除).xlsm 经过大表格注释和修改代码后,本代码能加密xls和xla类型的excel工作簿,点击加密后选择需要加密的工作簿,加密后可使VBA工程不可查看,点解密选择工作簿即可解密 源码开放 隐藏VBA模块 隐藏VBA工程模块 隐藏VBA工程视图 保护VBA代码 加密VBA代码

Hook钩子攻略 选择自 Gongnanpi 的 Blog

 一。写在最前 本文的内容只想以最通俗的语言说明钩子的使用方法,具体到钩子的详细介绍可以参照下面的网址:http://www.microsoft.com/china/community/program/originalarticles/techdoc/hook.mspx 二。了解一下钩子 从字面上理解,钩子就是想钩住些东西,在程序里可以利用钩子提前处理些Window

异道的专栏 1819

VBA鼠标键盘钩子类.xlsm

VBA鼠标键盘钩子类.xlsm

山景BP10_128DBG开发板通过蓝牙连接手机放歌实验回顾

最近在学习上海山景公司的BP10_128DBG的开发板,因为网上关于BP10开发板的帖子也比较少,在学习的时候也没有太多的参考资料,基本上都是官方的历程。蓝牙放歌这个demo对我来说也比较复杂,特写下此博客进行记录、总结,大家有需要的可以参考。

weixin_56646002的博客 2020

Hook钩子攻略 (转载)

Hook钩子攻略 转载自   http://www.cnblogs.com/starspace/archive/2008/11/06/1328393.html Hook钩子攻略一。写在最前本文的内容只想以最通俗的语言说明钩子的使用方法,具体到钩子的详细介绍可以参照下面的网址:http://www.microsoft.com/china/community/program

leehyfer的专栏 532

python 写一个简单的 telegram bot (电报机器人)

replit.com 环境配置太恶心了,只能使用 poetry.poetry 这个名字是挺好听,用起来也是很垃圾,太恶心。heroku.com 注册登录不方便,需要各种验证。所以,部署的问题,目前搁置。

waterHBO的博客 3197

CodeGPT钩子全攻略:自动安装git prepare-commit-msg hook,提交信息从此零烦恼

在日常的开发工作中,编写规范、清晰的Git提交信息是一项重要但常常被忽视的任务。不规范的提交信息不仅会降低团队协作效率,还会给后续的代码维护和版本回溯带来困难。CodeGPT作为一款基于Go语言开发的CLI工具,通过集成ChatGPT AI(支持gpt-4、gpt-3.5-turbo模型),能够自动为你生成规范的git提交信息或进行代码审查,并自动安装git prepare-commit-msg钩

gitblog_00646的博客 322

FFmpeg实战:5分钟搞定m3u8视频下载与ts文件合并(附完整命令)

本文详细介绍了如何使用FFmpeg快速下载m3u8视频并合并ts文件为mp4格式。通过简洁的命令行操作,读者可以轻松完成视频处理任务,包括环境准备、链接获取、下载合并及性能优化等实用技巧,特别适合需要高效处理流媒体内容的用户。

weixin_30836759的博客 221

Windows11 - Ubuntu 双系统及 ROS、ROS2 安装

在本教程中,我们将使用 Ubuntu 20.04 版本,该版本使用了新的 Ubuntu 桌面安装程序,该程序将包含在今后发布的所有 Ubuntu 版本中。如果你选择了这个选项,你会看到一个简单的界面,允许你选择要安装Ubuntu的硬盘,并通过滑块来决定你希望Ubuntu使用的磁盘空间大小。如果你的电脑有多个硬盘驱动器,那么只要它们各自有自己的驱动器,这个选项就能让你在安装 Ubuntu 的同时安装现有的操作系统。在此屏幕上,系统会提示您输入您的姓名和您的计算机名称,以显示在网络上。

机器人控制与仿真应用 4509

零基础入门Vibe Coding Agent智能体开发全攻略:Agent概念与三大组成、单元测试技能开发、测试专家数字员工Subagent、质量工程师数字员工、注释检查与安全审计技能、Hook钩子拦截

所谓Agent(智能体/代理),本质上就是一个数字员工。它由三部分组成:组成部分作用现实类比技能Skills决定这个Agent能做什么事,技能越多能力越强员工掌握的专业技能,比如财务技能、编程技能记忆MemoryAgent知道自己是谁、要干什么、之前发生了什么员工的工作记忆和经验积累模型ModelAgent的大脑,负责思考、决策、推理员工的智商和思维能力这三者缺一不可,组合在一起就形成了一个可以独立干活的数字员工。Hook(钩子)就是一种拦截机制。

见字如面,祝您早安,午安,晚安 1055

Coze智能体开发:如何搭建一个生成长文本的工作流

扣子工作流提供了流程定制化的能力,我们可以把长文生成的流程拆分为多个步骤,例如先通过大模型节点生成大纲、再使用循环节点依次扩写各个段落,最后将各个段落组合起来,从而实现长文生成流程。此工作流可适用于学术写作、商业报告、小说创作等多种场景。

王国平的博客 1789

Hook钩子C#实例

Hook钩子攻略一。写在最前 本文的内容只想以最通俗的语言说明钩子的使用方法,具体到钩子的详细介绍可以参照下面的网址:http://www.microsoft.com/china/community/program/originalarticles/techdoc/hook.mspx 二。了解一下钩子 从字面上理解,钩子就是想钩住些东西,在程序里可以利用钩子提前

如是所来的专栏 1528

TC3XX - MCAL知识点(三十五):Tasking编译器下,Tc3xx的MCAL代码如何使用多核,多核中断、多核任务、多核外设之间的MCAL配置与代码例程

文章用于记录在裸机情况下使用多核Tc387芯片,如何高效运行以及正确的代码、工程属性、链接文件配置等问题,相互结合、相互影响的地方,以示后续使用记录。

梦想技术家 963

34、量子概率幅世界与相关操作解析

本文详细解析了量子概率幅的概念及其在量子力学中的核心作用,介绍了量子态的表示方法与叠加原理,讨论了幺正操作在量子演化中的重要性,并阐述了量子测量的基本原理与影响。此外,文章还分析了量子系统在量子计算中的应用,包括干涉在量子算法中的作用、量子门的组合使用以及量子测量的关键地位,总结了量子系统的独特特性与面临的挑战,展望了量子计算的未来发展趋势。

pytorch8learner的博客 175
上一篇: C#键盘钩子 (转)
下一篇: C# 根据年、月、周、星期获得日期等
蝶恋花雨
博客等级 码龄21年 1290粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值