首页 > 其他分享 >使用钩子函数

使用钩子函数

时间:2023-05-13 15:15:06浏览次数:55  
标签:wParam end 函数 钩子 线程 使用 Sender

钩子分两种, 一种是系统级的全局钩子; 一种是线程级的钩子.
全局钩子函数需要定义在 DLL 中, 从线程级的钩子开始比较简单.

其实钩子函数就三个:
设置钩子: SetWindowsHookEx
释放钩子: UnhookWindowsHookEx
继续钩子: CallNextHookEx
在线程级的钩子中经常用到 GetCurrentThreadID 函数来获取当前线程的 ID.

下面例子中设定了一个线程级的键盘钩子, 专门拦截字母 A.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  end;

{声明键盘钩子回调函数; 其参数传递方式要用 API 的 stdcall}
function KeyHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;

var
  Form1: TForm1;

implementation

{$R *.DFM}

var
  hook: HHOOK; {定义一个钩子句柄}

{实现键盘钩子回调函数}
function KeyHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT;
begin
  if (wParam = 65) then Beep; {每拦截到字母 A 会发声}
  Result := CallNextHookEx(hook, nCode, wParam, lParam);
end;

{设置键盘钩子}
procedure TForm1.FormCreate(Sender: TObject);
begin
  hook := SetWindowsHookEx(WH_KEYBOARD, @KeyHook, 0, GetCurrentThreadID);
end;

{释放键盘钩子}
procedure TForm1.FormDestroy(Sender: TObject);
begin
  UnhookWindowsHookEx(hook);
end;

end.

标签:wParam,end,函数,钩子,线程,使用,Sender
From: https://www.cnblogs.com/lucken2000/p/17397413.html

相关文章

  • 钩子详解
    钩子函数虽然不多,但其参数复杂,应该从参数入手才能深入进去.UnhookWindowsHookEx只需要SetWindowsHookEx返回的钩子句柄作参数,这个简单;先看看SetWindowsHookEx的声明:SetWindowsHookEx( idHook:Integer; {钩子类型} lpfn:TFNHookProc;{函数指针} hmod:......
  • 建立一个全局的鼠标钩子
    分两步:一、建立DLL,并在DLL实现钩子的设置、释放和钩子函数;二、再建一个工程调用测试.第一步:做DLL先建立一个DLL工程,自动初始的代码如下(去掉注释了):libraryProject1;uses SysUtils, Classes;{$R*.res}beginend.//把工程保存为MyHook.dpr,并实......
  • SetWindowsHookEx - 设置钩子
    提示:如果要设置系统级钩子,钩子函数必须在DLL中.SetWindowsHookEx( idHook:Integer; {钩子类型} lpfn:TFNHookProc;{函数指针} hmod:HINST;   {包含钩子函数的模块(EXE、DLL)句柄;一般是HInstance;如果是当前线程这里可以是0} dwThreadId:DW......
  • ETL工具Kettle使用备忘
    excel中sheet中有多个表格,必须整理到其他sheet,把整理好的sheet转换上传。   https://blog.csdn.net/qq_22310551/article/details/115163517::Kitchen.bat所在路径盘符E:::Kitchen.bat所在目录???cdE:\app\pdi-ce-9.3.0.0-428\data-integration::作业(job)文件......
  • 用扩展的方式在 PHP 中使用 Kafka
    前言:    由于之前在PHP中使用Kafka是通过composer包的方式,由于 nmred/kafka-php很久没有维护,并且网上相关问题的文章也比较少。所以我这次换成PHP扩展 RdKafka继续使用,主要介绍扩展安装和这种方式的基本操作。 安装:1.下载2.目录    由于php-rdkafka......
  • 如何在业务代码中使用 ThinkPHP5.1 封装的容器内反射方法
    invokeClass用法:可以不传命名空间实例化(通过反射实例化)$obj=Container::getInstance()->invokeClass(InvokerTest::class);var_dump($obj->invokerNews());die;-----------------------------------------------------------------------invokeMethod用法:传入带命名空间的类和......
  • 【翻译】使用粒子群优化和引力搜索算法与神经网络的模糊混合在室内环境中进行用户定位
    (UserLocalizationinanIndoorEnvironmentUsingFuzzyHybridofPartiocleSwarmOptimization&GravitationalSearchAlgorithmwithNeuralNetworks)JayantG.Rohra1,BoominathanPerumal1(&),SwathiJamjalaNarayanan1,PriyaThakur1,andRajenB.......
  • css基本介绍+嵌套使用+选择器+列表样式+绝对定位
    1. 什么是CSS,有什么作用?  01CSS(Cascading Style Sheet):层叠样式表语言。CSS的作用是: 修饰HTML页面,设置HTML页面中的某些元素的样式,让HTML页面更好看。 CSS好比是HTML的化妆品一样。HTML还是主体,CSS依赖HTML。CSS的存在就是修饰HTML,所以新建的文件还是xx.html文件。2、CSS......
  • 使用 Haproxy 搭建 Web 群集
    一、常见的Web集群调度器目前常见的Web集群调度器分为软件和硬件,软件通常使用开源的LVS、Haproxy、Nginx,硬件一般使用比较多的是F5,也有很多人使用国内的一些产品,如梭子鱼、绿盟等。二、Haproxy与LVS应用对比分析LVS在企业应用中抗负载能力很强,但不支持正则处理,不能实现......
  • 如何使用Docker构建运行时间较长的脚本
    问题让我们从这个我试图解决的问题开始。我开发了一个会运行很长时间的构建脚本,这个脚本中包含了很多的步骤。这个脚本会运行1-2个小时。它会从网络下载比较大的文件(超过300M)。后面的构建步骤依赖前期构建的库。但最最烦人的是,运行这个脚本真的需要花很长的时间。文件系统是固......