初学者关于键盘钩子的疑问?找了好久还是没解决(50分)

  • 主题发起人 主题发起人 muyixin
  • 开始时间 开始时间
M

muyixin

Unregistered / Unconfirmed
GUEST, unregistred user!
本来想屏蔽win键的 开始使用系统热键 好像不能当读注册win 改用键盘钩子 可在学习过程中 还时有些问题不时弄的很明白
下面一段代码时在网上找到最多的
library HideWin;
uses
Windows, SysUtils, Messages,Classes;
{$R *.res}
var
KeyHook: HHook;

function HookKey(Code: integer;
wParam: wParam;
lParam: lParam): LRESULT;
stdcall;
type
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
KBDLLHOOKSTRUCT = record
vkCode: DWORD;
ScanCode: DWORD;
Flags: DWORD;
Time: DWORD;
dwExtraInfo: DWORD;
end;

begin


//屏蔽win键
if (Code = HC_ACTION) and ((PKBDLLHOOKSTRUCT(lParam).vkCode = VK_LWIN)
or (PKBDLLHOOKSTRUCT(lParam).vkCode = VK_RWIN)) then

begin

Result := 1;
end
else
begin

Result := CallNextHookEx(KeyHook, Code, wParam, lParam);
end;

end;


procedure begin
Hook;
begin

KeyHook := SetWindowsHookEx(13{=WH_KEYBOARD_LL}, @HookKey, HInstance, 0);

//第四个参数为0 表示为全局钩子
end;


procedure EndHook;
begin

UnhookWindowsHookEx(KeyHook);
end;


exports
begin
Hook, EndHook;

begin


end.


不明白的地方是function HookKey(Code: integer;
wParam: wParam;
lParam: lParam): LRESULT;
stdcall;中为什么要定义这么一个记录 而且是这样定义的
type
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
KBDLLHOOKSTRUCT = record
......
end

在函数中的参数引用也用这个记录来引用 就更不明白了 为什么不直接用呢?
找了好久 还是没答案?
 
自己顶一下!!高手们来传授一下
 
function HookKey(Code: integer;
wParam: wParam;
lParam: lParam): LRESULT;
stdcall;
Code——指定如何处理消息。如果是HC_ACTION,表示lParam参数指向了一个EVENTMSG结构,这个结构中包含着一个从系统消息队列中移除的消息 就是说lParam指向了一个记录 就是我们定义的这个记录.可是这个记录是如何获得系统消息的呢? 猜想应该是和这个代码有关((PKBDLLHOOKSTRUCT(lParam).vkCode =vk_win
我是第一次看到这样用记录的 看到的都是首先要定义个记录类 在定义类的变量
那在一个指向记录类地址的指针类后加一个括号是什么用法 ??
 
我在顶 !!!!!!
 
为什么没人说一句呢???郁闷ing
 
在顶 我顶 顶 顶 顶 顶
 
想说来着
可惜不懂呀
 
主要是不能理解((PKBDLLHOOKSTRUCT(lParam).vkCode = VK_LWIN;
想来想去 我的理解如下
首先 不是在函数中定义了 PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT么? 说明其是一个指向记录的类型,而Code如果是HC_ACTION,表示lParam参数指向了一个EVENTMSG结构 说明lparam也是一个指针 那PKBDLLHOOKSTRUCT(lParam) 的中的括号是不是牵制转换的作用呢
这样EVENTMSG结构中的内容就到了PKBDLLHOOKSTRUCT指向的地址里了 不知道是不是这样

可还有不对的地方 首先就是声明了类后要申明类的变量 对于指针 要这样用
poingname^.ScanCode=... 而这个程序中却直接用了类名加()
所以还是不理解啊 !!!高手么 指点一下 该补那一课???
 
学习ing,帮顶
 
顶啊顶 顶啊顶 我顶顶顶 高手怎么不进来啊 顶顶 在顶
 
唉 还是基本功不过关啊
这两天又翻开书仔细的看了一下书
类+() 是强制转换为()前类的格式
PKBDLLHOOKSTRUCT(lParam) 就是把lParam这个指针转换为PKBDLLHOOKSTRUCT的格式
而 下面定义了PKBDLLHOOKSTRUCT的格式
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;
KBDLLHOOKSTRUCT = record
vkCode: DWORD;
ScanCode: DWORD;
Flags: DWORD;
Time: DWORD;
dwExtraInfo: DWORD;
end;

而在开始看程序时 我还在想 这个记录为什么要定义这么多元素,在程序中并没又用到? 现在想想 应该时为了和lParam这个类型有关 因为类型转换要求要求数据的长度一致
至于lparam指向的记录中的每个元素代表什么意思 这就要继续查资料了 windows API??

不知道我说的对不对 高手指点一下.......
 
后退
顶部