使用钩子函数[6]

上一个例子是从 DLL 中接受数据, 那怎么给 DLL 传递数据呢? 还有, 在接受数据时, 让 Timer 一直在那扫描也不是个好办法呀. 本例解决了这些问题(但不知解决了博友 "鹏" 的问题没有?).

为了方便测试, 提供一个源码下载吧: http://files.cnblogs.com/del/MouseHook_2.rar

本例效果图(和上一例是一样的):

DLL 文件:

library MyHook;

uses
SysUtils,
Windows,
Messages,
Classes;

{$R *.res}

const WM_MyMessage = WM_USER + 1; {自定义消息}

var
hook: HHOOK;
info: string;
h: HWND; {用作外部窗口的句柄}

{获取外部窗口的句柄}
function SetHWnd(hwnd: HWND): Boolean; stdcall;
begin
h := hwnd;
Result := True;
end;

function MouseHook(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
case wParam of
WM_MOUSEMOVE  : info := '鼠标位置';
WM_LBUTTONDOWN : info := '按下';
WM_LBUTTONUp  : info := '放开';
end;
info := Format('%s: %d,%d', [info, PMouseHookStruct(lParam)^.pt.X, PMouseHookStruct(lParam)^.pt.Y]);

{通过消息把数据传递给指定窗口}
PostMessage(h, WM_MyMessage, 0, Integer(PChar(info)));

Result := CallNextHookEx(hook, nCode, wParam, lParam);
end;

function SetHook: Boolean; stdcall;
const
WH_MOUSE_LL =14;
begin
hook := SetWindowsHookEx(WH_MOUSE_LL, @MouseHook, HInstance, 0);
Result := hook <> 0;
end;

function DelHook: Boolean; stdcall;
begin
Result := UnhookWindowsHookEx(hook);
end;

exports SetHook, DelHook, MouseHook, SetHWnd;
begin
end.

测试代码:

unit Unit1;

interface

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

const WM_MyMessage = WM_USER + 1;

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure MyMessage(var msg: TMessage); message WM_MyMessage; {定义一个消息方法接受消息}
end;

function SetHook: Boolean; stdcall;
function DelHook: Boolean; stdcall;
function SetHWnd(hwnd: HWND): Boolean; stdcall;

var
Form1: TForm1;

implementation

{$R *.dfm}

function SetHook; external 'MyHook.dll';
function DelHook; external 'MyHook.dll';
function SetHWnd; external 'MyHook.dll';

procedure TForm1.Button1Click(Sender: TObject);
begin
SetHook;
SetHWnd(Handle);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
DelHook;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Button1.Caption := '安装钩子';
Button2.Caption := '载卸钩子';
FormStyle := fsStayOnTop; {为了测试, 让窗口一直在前面}
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
DelHook;
end;

{把接受到的内容显示在窗体}
procedure TForm1.MyMessage(var msg: TMessage);
begin
Text := PChar(msg.LParam);
end;

end.

时间: 2024-08-10 19:09:29

使用钩子函数[6]的相关文章

WINDOWS钩子函数详解

本课中我们将要学习WINDOWS钩子函数的使用方法.WINDOWS钩子函数的功能非常强大,有了它您可以探测其它进程并且改变其它进程的行为. 理论:WINDOWS的钩子函数可以认为是WINDOWS的主要特性之一.利用它们,您可以捕捉您自己进程或其它进程发生的事件.通过"钩挂",您可以给WINDOWS一个处理或过滤事件的回调函数,该函数也叫做"钩子函数",当每次发生您感兴趣的事件时,WINDOWS都将调用该函数.一共有两种类型的钩子:局部的和远程的. 局部钩子仅钩挂您自

使用钩子函数[4]

SetWindowsHookEx 函数的第一个参数表示钩子类型, 共有 14 种选择, 前面我们已经用过两种: WH_KEYBOARD.WH_MOUSE. 系统会为每一种类型的钩子建立一个表(那就是 14 个表), 譬如某个应用程序启动了键盘钩子, 我们自己的程序也启动了键盘钩子, 同样是键盘钩子就会进入同一个表. 这个表(可能不止一个, 可能还会有鼠标钩子等等)就是传说中的"钩子链". 假如某个钩子链中共进来了三个钩子(譬如是: 钩子A.钩子B.钩子C 依次进来), 最后进来的 &q

使用钩子函数[3]

分两步: 一.建立 DLL, 并在 DLL 实现钩子的设置.释放和钩子函数; 二.再建一个工程调用测试. 第一步: 做 DLL 先建立一个 DLL 工程, 自动初始的代码如下(去掉注释了): library Project1; uses SysUtils, Classes; {$R *.res} begin end. //把工程保存为 MyHook.dpr, 并实现如下: library MyHook; uses SysUtils, Windows, {钩子函数都来自 Windows 单元} M

使用钩子函数[2]

钩子函数虽然不多, 但其参数复杂, 应该从参数入手才能深入进去. UnhookWindowsHookEx 只需要 SetWindowsHookEx 返回的钩子句柄作参数, 这个简单; 先看看 SetWindowsHookEx 的声明: SetWindowsHookEx( idHook: Integer; {钩子类型} lpfn: TFNHookProc; {函数指针} hmod: HINST; {包含钩子函数的模块(EXE.DLL)的句柄} dwThreadId: DWORD {关联的线程} )

使用钩子函数[1]

目前对钩子的理解: 譬如我们用鼠标在某个窗口上双击了一次, 或者给某个窗口输入了一个字母 A; 首先发现这些事件的不是窗口, 而是系统! 然后系统告诉窗口: 喂! 你让人点了, 并且是连续点了两鼠标, 你准备怎么办? 或者是系统告诉窗口: 喂! 有人向你家里扔砖头了, 不信你看看, 那块砖头是 A. 这时窗口的对有些事件会忽略.对有些事件会做出反应: 譬如, 可能对鼠标单击事件忽略, 窗口想: 你单击我不要紧, 累死你我不负责; 但一旦谁要双击我, 我会马上行动, 给你点颜色瞧瞧! 这里窗口准备

c++-如何使用钩子函数来监听元器件引脚值变化

问题描述 如何使用钩子函数来监听元器件引脚值变化 做一个类似于Proteus的仿真软件,用C++写,如何检测每个元器件引脚值的变化(老师说用钩子函数),表示看不懂,不会用 ,有没有做过类似软件的大神,求教,谢谢! 解决方案 所谓的钩子函数就是回调函数,在中断检测变化后会触发这个回调,具体要看你用的库 解决方案二: 利用SetHook函数知识,写一个用于处理的回调函数即可

64位linux hook-如何在64位Linux下Hook,实现跳转到自己定义的钩子函数?

问题描述 如何在64位Linux下Hook,实现跳转到自己定义的钩子函数? 想在64bit的linux上,做Hook. 实现如下功能: 1.由系统函数跳转到自己定义的钩子函数,如何是爱心啊注意:是64bit系统不是32系统. 解决方案 http://zhidao.baidu.com/link?url=4AY8D7d4nyNdlNKp43kvBZ6bPB_6XrWpyELhN55LbzqLuVpMkNBllFoGtqNRmiZ_ZuQpT80aMD_kX56zXIY1La 解决方案二: 在vim上

vc++6 0-全局键盘钩子函数的回调函数有时无效

问题描述 全局键盘钩子函数的回调函数有时无效 DLL代码: myHooke.c #include "myHooke.h" #include <windows.h> #include <winuser.h> #include <stdlib.h> #include <stdio.h> int ndown = 0; HHOOK hhkHook = NULL; //定义钩子句柄 HINSTANCE hInstance = NULL; //程序实

Delphi - 关于钩子函数HOOK

                                                            Delphi - 关于钩子函数HOOK (1)基本概念钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的.当消息到达后,在目标窗口处理函数之前处理它.钩子机制允许应用程序截获处理window消息或特定事件.钩子实际上是一个处理消息的程序段,通过系统调用,把它挂入系统.每当特定的消息

使用钩子函数[5]

前言: 博友 "鹏" 来信探讨关于钩子的问题, 核心困难是: dll 中的数据如何传递出来. 在接下来的两个例子中探讨这个问题. 本例建立一个全局的鼠标钩子, 然后把鼠标的相关信息通过一个自定义的 GetInfo 函数传递给调用钩子的程序. 为了方便测试, 提供一个源码下载吧: http://files.cnblogs.com/del/MouseHook_1.rar 本例效果图: DLL 文件: library MyHook; uses SysUtils, Windows, Messa