简单全局HOOK拦截大部分键盘消息

时间:2022-03-31 10:06:34

前言:学习HOOK中,
万一老师讲解HOOK入门教程:http://www.cnblogs.com/del/category/124150.html

http://www.cnblogs.com/del/category/124150.html

正题:全局HOOK拦截大部分键盘消息,Ctrl+alt+del 同Num Lock 目前测试无法截获。

写全局Hook基本步骤:
因为为全局Hook,要用到dll,以后就不知道需要不…………

一.创建dll
1.声明同实现回调函数
2.创建安装钩子函数
3.创建卸载钩子函数
4.按照dll格式输出函数

二、创建exe调用dll

源代码:

///////////////////////////dll代码////////////////////////////////////
//Delphi代码: dll代码

library MyHook;
uses
 SysUtils,
 Windows,
 Messages,
 Classes;

{$R *.res}
var
hook: HHOOK; {钩子变量}

//声明实现回调函数
function KeyHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
Result := 1; //1为杀掉,0为放过
end;

//创建安装钩子函数
function SetHook: Boolean; stdcall;
begin
 hook := SetWindowsHookEx(WH_KEYBOARD, @keyHook, HInstance, 0);
 Result := hook <> 0;
end;

//创建卸载钩子函数
function DelHook: Boolean; stdcall;
begin
 Result := UnhookWindowsHookEx(hook);
end;

{按 DLL 的要求输出函数}
exports
 SetHook name 'SetHook',
 DelHook name 'DelHook',
 keyHook name 'keyHook';

end.

///////////////////////////EXE代码////////////////////////////////////

//Delphi代码: EXE
unit Unit1;

interface

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

type
 TForm1 = class(TForm)
 Button1: TButton;
 Button2: TButton;
 Memo1: TMemo;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
end;

{DLL 中的函数声明}
function SetHook: Boolean; stdcall;
function DelHook: Boolean; stdcall;

var
 Form1: TForm1;

implementation

{$R *.dfm}

{DLL 中的函数实现}
function SetHook; external 'MyHook.dll' name 'SetHook';
function DelHook; external 'MyHook.dll' name 'DelHook';

{安装钩子}
procedure TForm1.Button1Click(Sender: TObject);
begin
 SetHook;
end;

{卸载钩子}
procedure TForm1.Button2Click(Sender: TObject);
begin
 DelHook;
end;

{载次卸载钩子}
procedure TForm1.FormDestroy(Sender: TObject);
begin
 DelHook;
end;

end.

//看了这么多例程,只有这个最让人懂~ 全文:http://www.cnblogs.com/piaohun/archive/2008/07/06/1237031.html

简单全局HOOK拦截大部分键盘消息的更多相关文章

  1. 使用PreTranslateMessage替代钩子函数处理键盘消息

    2002年左右,我所在公司在开发基于H.323的VoIP电话系统(用了以色列一家公司的库,具体名字忘记了). 去电信科技研究院测试系统,同事发现处理键盘消息总有一些莫名其妙的问题,比如延迟或异常. 我 ...

  2. keybd&lowbar;event跟SendMessage&comma;PostMessage模拟键盘消息的区别 z

    首先你会发现keybd_event函数中是没有窗口句柄作为参数的,好奇的你一定会觉得很奇怪,那是因为,keybd_event是全局模拟按键的,只对前台窗口(即当前的活动窗口)才可以,但是如果模拟的按键 ...

  3. HOOK函数&lpar;二&rpar;——全局HOOK

    如果钩子函数定义于当前进程相关的线程中,则钩子函数只能处理当前进程的线程的消息,如果要想处理当前正在运行的所有进程的鼠标消息和键盘消息,那么安装钩子函数的代码必须实现在动态链接库中.所以如果想让安装的 ...

  4. TControl的消息覆盖函数大全(15个WM&lowbar;函数和17个CM&lowbar;函数,它的WndProc就处理鼠标与键盘消息)

    注意,这些函数只有Private一种形式(也就是不允许覆盖,但仍在动态表格中)(特别注意,这里居然没有WM_PAINT函数): TControl = class(TComponent) private ...

  5. 基于Xposed hook 实时监测微信消息

    本文以微信版本6.7.3为例进行分析有hook, 大部分做微信机器人的话,首先要实时抓取微信的消息,在这里展示三种方式对微信的消息进行hook: 1.基于UI层拉取加载进行监听 2.基于微信dao层调 ...

  6. SpringBoot 全局异常拦截捕获处理

    一.全局异常处理 //Result定义全局数据返回对象 package com.xiaobing.demo001.domain; public class Result { private Integ ...

  7. VC&plus;&plus; 对话框程序响应键盘消息的处理方法的说明&lpar;非常重要&rpar;

    基于MFC对话框的应用程序在响应按键消息和热键方面都力不从心,CDialog类的消息循环中去掉了TranslateAccelerator函数,因此不能响应热键:同时由于对话框上可能有很多控件,且默认情 ...

  8. 【笨嘴拙舌WINDOWS】键盘消息,鼠标消息

    键盘消息 Windows系统无论何时只有一个窗口(可能是子窗口,也就是控件)能获得焦点. 焦点窗口通过windows消息来响应人的键盘操作,与键盘相关的常用消息罗列如下: WM_KEYDOWN   按 ...

  9. mfc对话框不能响应键盘消息

    这东西真是奇怪,找了半天原因,最终的发现却是让人抓狂,呵呵 现象:对话框按ESC或回车都不能关闭窗口(我没有处理PreTransplanteMessage),用spy++看,对话框完全收不到键盘消息 ...

随机推荐

  1. redis成长之路——(二)

    redis操作封装 针对这些常用结构,StackExchange.Redis已经做了一些封装,不过在实际应用场景中还必须添加一些功能,例如重试等 所以对一些常功能做了一些自行封装SERedisOper ...

  2. 【循序渐进学Python】1&period; Python基础知识

    1. Python安装和配置 首先需要到Python的官方网站(http://www.python.org/getit/) 下载安装包,现在Python的发行版分为兼容之前Python程序的Pytho ...

  3. TP-Link 无线路由器设置图文教程----怎么设置TP-Link无线路由器图解

    转自:http://www.jb51.net/softjc/39399.html 无线路由器的基础配置 在我们第一次配置无线宽带路由器时,参照说明书找到无线宽带路由器默认的IP地址是192.168.1 ...

  4. scala学习-类与对象

    类 / 对象 [<快学Scala>笔记] 一.类 1.Scala中的类是公有可见性的,且多个类可以包含在同一个源文件中: class Counter{ private var value ...

  5. &lt&semi;转载&gt&semi;Wait and Waitpid

    转载http://www.cnblogs.com/lihaosky/articles/1673341.html 一.Wait #include <sys/types.h> /* 提供类型p ...

  6. GBK和UTF8的区别

    GBK的文字编码是双字节来表示的,即不论中.英文字符均使用双字节来表示,只不过为区分中文,将其最高位都定成1. UTF-8编码则是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中 ...

  7. &lbrack;JAVA第二课&rsqb; java命名规则

    Java良好的命名规则以及代码风格可以看出来一个程序员的功底,好多公司也会注重这方面,他们招聘员工在有些时候往往就是根据一个人的代码风格来招人,所以下面就就我知道的代码风格作简要的说明一下.Java命 ...

  8. 搭建ruby环境

  9. String&period;format&lpar;String format&comma; Object&period;&period;&period; args&rpar;方法详解

    很多次见到同事使用这个方法,同时看到https://blog.csdn.net/qq_27298687/article/details/68921934这位仁兄写的非常仔细,我也记录一下,好加深印象. ...

  10. Docker Cache mechanism

    Docker build 的 cache 机制: Docker Daemon 通过 Dockerfile 构建镜像时,当发现即将新构建出的镜像 与已有的新镜像重复时,可以选择放弃构建新的镜像,而是选用 ...