windows api 钩子函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windows api 钩子函数相关的知识,希望对你有一定的参考价值。
vc编程实例
《Windows API编程》ISBN:7302105715
定价:32元
印刷日期:2006-1-9
图书简介:
本书在介绍Win32 API函数调用的基础上,重点介绍如何使用Windows SDK API开发Win32动态链接库和应用程序,并结合进程管理、进程通信、钩子函数、窗口子类化、API HOOK、Internet Explorer开发、网络编程等介绍了API函数在这些方面的综合应用。
本书中的实例源代码可通过下载。
本书主要面向熟悉Windows开发且有一定编程基础的中高级用户,旨在帮助用户提高系统编程的能力。
《Windows API程序设计参考大全》
出版社:人民邮电出版社
出版日期:2006年1月
定价:¥88
国标编号:ISBN 7-115-14167-3
页数:728
本书是关于Microsoft Win32
API函数的完整参考手册。本书详细介绍了每一个Win32
API函数的使用方法,其中着理介绍其原型表示、函数说明、参数说明、注意事项、相应头文件(.H)、链接库(.LIB或.DLL)和典型示例。对于每个函数本书给出了相应的示例,这样读者在阅读相应的Win32 API函数时就能很快地了解它的具体功能和使用方法,便于更快地掌握该接口函数。
本书是从事Microsoft Windows 操作系统开发和应用人员的必备参考书,也可作为大专院校相关专业师生自学、教学参考用书。
《Visual Basic 6.0 API函数开发实例》
开 本:787*1092 1/16
出版社:人民邮电出版社
出版日期: 2000-12-01
ISBN: 7115090300/TP2001
市场价: ¥41.00
图书简介:
Visual Basic 6.0是美国Microsoft公司开发Microsoft Visual Studio套件的一部分,是运行于Windows平台上的交互式的可视化集成开发环境。本书从API编程基础开始,以示例的形式全面介绍了Visual Basic 6.0支持的API函数的应用,涵盖了字体、文本、图形、高级绘图、图像处理、窗口、菜单、系统信息控制、消息控制等各个方面,揭去了API函数的神秘面纱,带领读者进入Windows程序开发的内部。本书通俗易懂,示例丰富,讲解细致,分析透彻,适合于中级程序开发人员学习使用,对于从事Visual Basic API函数开发与应用的广大科研人员、高校相关专业的师生也不失为一本有价值的自学和教学的参考书。
《Visual Basic.NET Win32 API大全》
出 版 社: 中国铁道出版社
ISBN: 711305523
原 价: ¥98
图书简介
这是一本快速查找Visual Basic.NET Windows API的函数库字典,内容主要包括:控件、硬件与系统、系统设备、绘图、图标、运算、工具栏、文本和字体、打印、文件处理、线程、Windows 消息、网络等Windows API函数。
这是一本快速查找Visual Basic.NET Windows API的函数库字典,内容主要包括:控件、硬件与系统、系统设备、绘图、图标、运算、工具栏、文本和字体、打印、文件处理、线程、Windows 消息、网络等Windows API函数。
《Visual Basic Win32 API编程》
作者:(美)罗曼
出 版 社: 中国电力出版社
ISBN: 750830534
原 价: ¥65
图书简介
Visual Basic将程序员和错综复杂的windows操作系统屏蔽开来,从而提供一种有效快速的应用程序开发环境。这只是一种折衷,它良好的开发简易性和快速性会导致较差的性能,并损失了灵活性和可控制性。幸运的是,Visual Basic是可以扩展的,当VB隐藏的细节妨碍了应用程序开发时,你总可以通过直接调用WIN32应用程序编程接口(API)来弥补VB的不足。
本书面向的对象是中级和高级VB程序员,他们对在自己的应用程序中组合windows的系统服务非常感兴趣。 参考技术A http://cid-3ba16e78a53d2d3d.office.live.com/self.aspx/VC/Hook.zip 参考技术B 给个邮箱我发份代码给你 自己做的本回答被提问者和网友采纳
用Delphi实现Windows的鼠标钩子函数
Delphi是基于PASCAL语言的Windows编程工具,功能十分强大。然而在Delphi的帮助
文件中,对Windows API函数的说明沿袭了 VC 的格式,和VC一样,对很多API函数的用法
没有举例子详细说明,对一些深入系统内部的API函数更是语焉不详,给编程者带来不便。
笔者仅就在Windows编程中鼠标钩子函数(HOOK)的实现,举例作一说明。
鼠标钩子函数也可叫做鼠标消息过滤器,是一种回调(CALLBACK)函数,归
系统调用。如果用SetWindowsHook或SetWindowsHookEx安装了鼠标钩子函数的地址, 每
当在屏幕上移动鼠标时,系统便将控制权交给鼠标钩子函数,这样便使我们能够有机会在
鼠标钩子函数内部截获各种鼠标消息,在这些消息还没有送达应用程序队列之前,显示它
们,改变它们或直接传给下一个缺省鼠标钩子函数。注意,鼠标钩子函数截获的是系统级
消息,而不是单个应用程序队列内的窗口消息;系统发给每个应用程序队列的鼠标消息都
可以用鼠标钩子函数来截获。
VC的Spy和Delphi的WinSpy均安装了钩子函数用来截获各种系统级的消息,其中就
包括鼠标钩子函数,键盘钩子函数,窗口钩子函数等。我们可以通过安装鼠标钩子函数来
仿制一个自己的SPY,当鼠标移动时,我们立即获得系统(包括非抢先的Windows3.1和
抢先Windows95)的控制权,在鼠标钩子函数内部实时地截获鼠标消息,显示鼠标的位置
和状态以及鼠标下窗口的局柄,标题栏,窗口类,窗口过程地址等。当然也可象“英汉通”
和“金山词霸”一样在鼠标钩子函数内调用InvalidateRect(),InvalidateRgn()来获得屏
幕上鼠标下的单词。(屏幕抓字的详情请见笔者的《深入Windows内部探险》中国计算机报
1998年第81期 )。
主程序SPY及其动态连接库MOUSEDLL的原代码和详细注释如下:
{*****************************************************
FILE : MOUSEDLL.DPR [email protected] 1998/11/18
〉DLL : MOUSEDLL.DLL
EXPORT: sethook 用来安装鼠标钩子函数 mouseproc
unhook 解除对鼠标钩子函数 mouseproc的安装
mouseproc 鼠标钩子函数本身
*****************************************************}
library Mousedll;
uses
Mousep in ‘MOUSEP.PAS‘ {Form1};
exports
sethook,
unhook,
mouseproc;
{$R *.RES}
begin
end.
{*************************************************************
file:Mousep.pas [email protected]
实现 setHook unHook mouseProc 3个输出函数
*************************************************************}
unit Mousep;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;
{在DLL中也可有FORM型的变量}
type
TForm1 = class(TForm)
Label1: TLabel; {显示wParam}
Label2: TLabel; {显示lParam}
Label3: TLabel; {显示x,y}
Label4: TLabel; {显示hwnd}
Label5: TLabel; {显示window text}
Label6: TLabel;
Label7: TLabel; {显示window class}
private
{ Private declarations }
public
{ Public declarations }
end;
function sethook:bool;export;
function unhook:bool;export;
function mouseProc(code:integer;w:integer;l:longint):bool;export;
var
Form1: TForm1;
idhook:longint;
formok:bool;
implementation
{*********************************************************************
声明安装函数setWindowsHookEx(),
在Delphi中如果用函数setWindowsHook()则不需声明。
微软说函数setWindowsHook已在Windows3.1中废弃,为与Windows3.0兼容仍保留。
实际上该函数setWindowsHook在Windows3.1和Windows95中仍可使用。
{*********************************************************************}
function setwindowsHookEx(id:integer;proc:tfarproc;hinst,htask:thandle):
longint;far;external ‘user‘;
{$R *.DFM}
{安装鼠标钩子函数mouseProc}
function sethook:bool;
var
hinst:thandle; {该动态连接库自己的模块局柄}
proc:tfarproc; {鼠标钩子函数mouseProc的地址}
begin
{在动态连接库中创建form1}
if formok=false then form1:=tform1.create(application) else exit;
formok:=true;{安装form1 后,设置formok,不许再安装form1}
{动态连接库的application指:调用动态连接库的主程序}
form1.show;
{不让用系统菜单来双击关闭Form1}
form1.BorderIcons:=form1.BorderIcons-[biSystemMenu];
hinst:=getModuleHandle(‘mousedll‘);
{得到mousedll.dll的模块局柄,即该动态连接库自己的模块局柄}
proc:=getProcAddress(hinst,‘mouseProc‘);
idhook:=setWindowsHookEx(WH_MOUSE,proc,hinst,0);
{用WH_MOUSE参数安装鼠标钩子后,移动鼠标时,系统自动调用mouseProc钩子}
if idhook =0 then sethook:=false else sethook:=true;
end;
{解除鼠标钩子函数mouseProc的安装}
function unhook:bool;
begin
if formok=true then form1.free else exit; {检查form1是否已经关闭}
formok:=false;{关闭了form1,设置formok=0}
if idhook=0 then exit;
unhookWindowsHookEx(idhook);
unhook:=true;
end;
{mouseProc不由应用程序调用,而是在鼠标移动后,由系统调用}
function mouseProc(code:integer;w:integer;l:longint):bool;
var
p:^TMouseHookStruct;
poff:word;
pseg:word;
pmemo:pchar;
begin
if code<0 then begin
mouseProc:=true;
CallNextHookEx(idhook,0,w,l);
end;
if code=HC_NOREMOVE then form1.caption:=‘HC_NOREMOVE‘;
form1.caption:=‘mouse hook‘;
mouseProc:=false;
{显示系统传来的wParam参数,w是各种鼠标消息的标识符 }
form1.label1.caption:=‘wParam=‘+intTostr(w);
{显示系统传来的lParam参数,l是MOUSEHOOKSTRUCT结构的地址}
form1.label2.caption:=‘lParam=‘+intTostr(l);
poff:=loword(l); {得到l的低16位}
pseg:=hiword(l); {得到l的高16位}
p:=ptr(pseg,poff); {合成指向MOUSEHOOKSTRUCT结构的指针}
{显示屏幕上鼠标的X,Y坐标}
form1.label3.caption:=‘pt.x=‘+intTostr(p^.pt.x)
+‘ pt.y=‘+intTostr(p^.pt.y);
{显示屏幕上鼠标下的窗口局柄}
form1.label4.caption:=‘hwnd=‘+intTostr(P^.hwnd);
pmemo:=stralloc(20);
getWindowText(p^.hwnd,pmemo,20-1);
{显示鼠标下窗口的标题栏}
form1.label5.caption:=strPas(pmemo);
getClassName(p^.hwnd,pmemo,20-1);
{显示鼠标下窗口的类}
form1.label6.caption:=strPas(pmemo);
strDispose(pmemo);
end;
end.
主程序原代码如下:
{*******************************************
MAINTRY.DPR [email protected]
******************************************}
program Maintry;
uses
Forms,
Tryp in ‘TRYP.PAS‘ {Form1};
{$R *.RES}
begin
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
{*********************************************
TRYP.PAS [email protected]
********************************************}
unit Tryp;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton; { 安装setHook按钮}
Button2: TButton; { 解除 unHook按钮}
Label1: TLabel; {显示安装,解除是否成功}
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
function sethook:bool;far;external ‘mousedll‘;
function unhook:bool;far;external ‘mousedll‘;
{声明后自动加载模块mousedll.dll}
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
if sethook then label1.caption:=‘set hook ok‘; {安装鼠标钩子函数}
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if unhook then label1.caption:=‘unhook ok‘; {解除鼠标钩子函数}
end;
end.
http://blog.csdn.net/diligentcatrich/article/details/6934092
以上是关于windows api 钩子函数的主要内容,如果未能解决你的问题,请参考以下文章