我按照网上的代码自己写底层键盘钩子(自己写可以加深印象),由这些代码产生了一个问题,希望热心的朋友能帮忙解释一下,谢谢!
底层键盘钩子的回调函数是这样的
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 这样类似的代码呢?他们的区别在哪里?为什么要那样用?

解决方案 »

  1.   

    1 结构指针(记录指针)
    2 指针表示的是内存的地址,在32位的系统里地址范围就是32位(4个字节)
      整数Integer也是4个字节,所以可以用整数来表示地址或者与地址相互转换,因为都是4个字节
      p^.vkCode 和 p.vkCode 作用完全一样只是语法上允许通过这样两种方式访问指针所指向的数据,建议使用p^.vkCode更清楚一些3 <...>
      

  2.   

    是因为指针的字节占用和 Integer的字节占用相同而  p^.vkCode 和 p.vkCode 的调用相同,还是不论什么情况 p^.vkCode 和 p.vkCode 这样的调用都相同呢(不光指 vkCode 是 Integer 类型的情况下)?
      

  3.   

    不论什么情况 p^.vkCode 和 p.vkCode 这样的调用都相同呢什么是指针计算机并不知道一断内存是整数还是字符串还是浮点数还是你的照片
    对于计算机来说只有“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可以看成地址偏移量)在以后的学习和工作中慢慢理解吧
      

  4.   

    谢谢 zswang(伴水清清)(专家门诊清洁工) !非常感谢!