关于钩子中数据类型转换? ( 积分: 100 )

  • 主题发起人 主题发起人 ff_ff
  • 开始时间 开始时间
F

ff_ff

Unregistered / Unconfirmed
GUEST, unregistred user!
type
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
KBDLLHOOKSTRUCT = record
vkCode: DWORD;
ScanCode: DWORD;
Flags: DWORD;
Time: DWORD;
dwExtraInfo: DWORD;
end;
var
p: PKBDLLHOOKSTRUCT;

p:=PKBDLLHOOKSTRUCT(Lparam)

其中Lparam是键盘钩子过程函数的参数
function keyHookProc(nCode: Integer;WParam: WPARAM;LParam: LPARAM): LRESULT;stdcall;
问:
1.Lparam中Longint型的,PKBDLLHOOKSTRUCT是个结构体指针,怎么能强制转?
2.钩子过程函数的参数中LParam是做什么用的?
3.Windows调用键盘钩子过程,把消息传给Lparam参数怎么再用KBDLLHOOKSTRUCT保存在vkCode: DWORD;域中?
4.hHk := SetWindowsHookEx(13,@keyHookProc,HInstance,0);idHook参数为了13这是安装的什么钩子.,怎么查到的
 
type
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
KBDLLHOOKSTRUCT = record
vkCode: DWORD;
ScanCode: DWORD;
Flags: DWORD;
Time: DWORD;
dwExtraInfo: DWORD;
end;
var
p: PKBDLLHOOKSTRUCT;

p:=PKBDLLHOOKSTRUCT(Lparam)

其中Lparam是键盘钩子过程函数的参数
function keyHookProc(nCode: Integer;WParam: WPARAM;LParam: LPARAM): LRESULT;stdcall;
问:
1.Lparam中Longint型的,PKBDLLHOOKSTRUCT是个结构体指针,怎么能强制转?
2.钩子过程函数的参数中LParam是做什么用的?
3.Windows调用键盘钩子过程,把消息传给Lparam参数怎么再用KBDLLHOOKSTRUCT保存在vkCode: DWORD;域中?
4.hHk := SetWindowsHookEx(13,@keyHookProc,HInstance,0);idHook参数为了13这是安装的什么钩子.,怎么查到的
 
about question 2 you could find the answer in Delphi online helps
 
那都是c里面的知识,指针不就是一个地址吗,也就是一个数而已,lparam和wparam是参数具体情况确定它们代表的意义,SetWindowsHookEx(13,@keyHookProc,HInstance,0),13是个数,可以看SetWindowsHookEx的帮助,"Windows调用键盘钩子过程,把消息传给Lparam参数怎么再用KBDLLHOOKSTRUCT保存在vkCode: DWORD;域中"这也是指针操作,你把指针传给window,它处理完后在地址里返回值,都是基础,学过c就容易明白。
 
怎么人这么少,等待.........
 
第1.钩子函数传递进来的Lparam,其实是一个指针,而并非是一个消息参数.所以用一个消息结构指针可以对这个Longint型的Lparam进行强制转换.个人认为,Lparam指向的值是依据钩子类型不同而不同的(当然是在相同的消息的前提下).以下方法为证:
当钩子类型为WH_mouse时,在钩子函数中有如下代码:
if wParam = WM_RBUTTONDOWN then //如果按下右键,进行以下操作.
begin

myini:=tinifile.Create('1.ini') ;
i:=i+1
//i为全局变量
myini.WriteInteger('wp1',inttostr(i),wParam);//将钩子函数中的参数保存.
myini.WriteInteger('lp1',inttostr(i), Msg);
myini.WriteInteger('hwnd',inttostr(i),PMsg(Msg)^.hwnd);//将参数msg,即你代码中的lParam指向的数据保存.
myini.WriteInteger('message',inttostr(i),PMsg(Msg)^.message );
myini.WriteInteger('wparam2',inttostr(i),PMsg(Msg)^.wParam);
myini.WriteInteger('lparam',inttostr(i),PMsg(Msg)^.lParam );
myini.WriteInteger('time',inttostr(i),PMsg(Msg)^.time );
myini.WriteInteger('pt',inttostr(i),PMsg(Msg)^.pt.X );
myini.Destroy ;
end;

当钩子类型为WH_getmessage时,采用如下代码:

if PMsg(Msg)^.wParam = WM_RBUTTONDOWN then //如果按下右键,进行以下操作.
begin

myini:=tinifile.Create('1.ini') ;
i:=i+1
//i为全局变量
myini.WriteInteger('wp1',inttostr(i),wParam);//将钩子函数中的参数保存.
myini.WriteInteger('lp1',inttostr(i), Msg);
myini.WriteInteger('hwnd',inttostr(i),PMsg(Msg)^.hwnd);//将参数msg,即你代码中的lParam指向的数据保存.
myini.WriteInteger('message',inttostr(i),PMsg(Msg)^.message );
myini.WriteInteger('wparam2',inttostr(i),PMsg(Msg)^.wParam);
myini.WriteInteger('lparam',inttostr(i),PMsg(Msg)^.lParam );
myini.WriteInteger('time',inttostr(i),PMsg(Msg)^.time );
myini.WriteInteger('pt',inttostr(i),PMsg(Msg)^.pt.X );
myini.Destroy ;
end;

比较保存在1.ini中的结果发现,相同的消息(同一条件按下右键),lParam 结构中数据值不一致,说明了lParam的参数值是依据钩子类型变化的.如果想得到进一步数据结构,可以用上面的方法进行分析.

第2.基于上面的分析,以及帮助文档.LParam和wParam都是消息参数,基于我的理解,wParam参数一般就是直接的参数值,而LParam参数可以是消息参数的缓冲区指针(可以联想到16位进程中的sendmessage函数发送字符串消息时,LParam参数就是一个字符串指针).而且,这两个参数的值是以消息类型变化而变化的,所以要分析其具体作用,只能视情况而定,可知的就是这两个参数是在消息参数.

第3.还是基于第一点分析,由于Lparam是一个结构指针,而vkCode是这个结构中的一个域,所以无法进行保存.只能是vkCode:=Lparam^.vkCode,否则就算是类型上没错,其得到的值将完全不同.

第4.13是前面提到的钩子类型,当然你这里的核心问题是怎么查到的.这个简单,WH_getmessage,WH_cbt等都是在windows.pas中声明的,打开这个单元去查一下就OK了.
 
PMsg=PKBDLLHOOKSTRUCT
 
接受答案了.
 
后退
顶部