我按照网上的代码自己写底层键盘钩子(自己写可以加深印象),由这些代码产生了一个问题,希望热心的朋友能帮忙解释一下,谢谢!
底层键盘钩子的回调函数是这样的
function LowLevelKeyboardProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
回调函数中的 lParam 参数通过类型转换 PKBDLLHOOKSTRUCT(lParam) 转换成 PKBDLLHOOKSTRUCT 数据类型。
这是 PKBDLLHOOKSTRUCT 的定义
TKBDLLHOOKSTRUCT = record
vkCode: DWORD;
ScanCode: DWORD;
Flags: DWORD;
Time: DWORD;
dwExtraInfo: DWORD;
end;
KBDLLHOOKSTRUCT = TKBDLLHOOKSTRUCT;
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;我的问题是这样的:
1、 PKBDLLHOOKSTRUCT 应该准确的叫做什么? 结构?结构指针?或者都不对?
2、 PKBDLLHOOKSTRUCT(lParam) 转换而来的数据怎么正确的获取数据? 比方说 p := PKBDLLHOOKSTRUCT(lParam); ,那么获取 p 结构中 vkCode 数据的时候用 p^.vkCode 正确还是 p.vkCode 正确?
3、 什么时候该用 p^.vkCode 这样类似的代码,什么时候又该用 p.vkCode 这样类似的代码呢?他们的区别在哪里?为什么要那样用?
底层键盘钩子的回调函数是这样的
function LowLevelKeyboardProc(nCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
回调函数中的 lParam 参数通过类型转换 PKBDLLHOOKSTRUCT(lParam) 转换成 PKBDLLHOOKSTRUCT 数据类型。
这是 PKBDLLHOOKSTRUCT 的定义
TKBDLLHOOKSTRUCT = record
vkCode: DWORD;
ScanCode: DWORD;
Flags: DWORD;
Time: DWORD;
dwExtraInfo: DWORD;
end;
KBDLLHOOKSTRUCT = TKBDLLHOOKSTRUCT;
PKBDLLHOOKSTRUCT = ^KBDLLHOOKSTRUCT;我的问题是这样的:
1、 PKBDLLHOOKSTRUCT 应该准确的叫做什么? 结构?结构指针?或者都不对?
2、 PKBDLLHOOKSTRUCT(lParam) 转换而来的数据怎么正确的获取数据? 比方说 p := PKBDLLHOOKSTRUCT(lParam); ,那么获取 p 结构中 vkCode 数据的时候用 p^.vkCode 正确还是 p.vkCode 正确?
3、 什么时候该用 p^.vkCode 这样类似的代码,什么时候又该用 p.vkCode 这样类似的代码呢?他们的区别在哪里?为什么要那样用?
解决方案 »
- 通用html中的js代码如何调用delphi的方法
- 关于数据显示问题。谢谢各位
- 女程序员----全世界有多少个?
- richedit的难问题
- 录求最快的 进制转换方法~(byte -> string,hex -> binary...)
- ★如何将messagebox窗口显示在最前端,并且定时自动关闭?
- 求人帮写一个delphi socket的程序。
- 谁能告诉我ParamStr()是什么意思,以及它的用法
- 有没有什么好看点的datetimepicker控件?D5、D6带的那个我看腻了
- 数据库问题----
- 怎么让弹出窗体MessageBox 出现在主窗体的右上角位置
- CoIntialize(nil);CoUnitialize;该引用什么啊
2 指针表示的是内存的地址,在32位的系统里地址范围就是32位(4个字节)
整数Integer也是4个字节,所以可以用整数来表示地址或者与地址相互转换,因为都是4个字节
p^.vkCode 和 p.vkCode 作用完全一样只是语法上允许通过这样两种方式访问指针所指向的数据,建议使用p^.vkCode更清楚一些3 <...>
对于计算机来说只有“0”和“1”
这些“0”和“1”要么放在内存里、要么放在磁盘里、或者就是在寄存器里
你要读取这些“0”和“1”你就必须知道它们存放的位置
这个位置就可以理解为指针,就像你家门牌号一样,知道后就能找到你
只要访问内存就需要指针(必须确定内存数据存放的位置)给你4个字节的空间
你可以用来保存4个char、4个byte、2个byte和1个word、1个Integer....
你把内存中的一段数据当成什么类型来读取,完全由你来控制
当然如果你想保存你的照片那明显远远不够,所以你需要更多的空间注意:指针本身也是一种数据,它要占用4个字节01100001 01100001 01100001 01100001 00000000 11111111 00000000 11111111...
^ ^ ^
Pointer(0) Pointer(2) Pointer(5)
如果lParam = 2
那P := PKBDLLHOOKSTRUCT(lParam)
就是把P赋值为2号地址
p^.vkCode这样就是从2号地址上取内容(vkCode可以看成地址偏移量)在以后的学习和工作中慢慢理解吧