多谢各位回答我的问题。我就是要HOOK键盘,但是记录不下来用户敲了哪个键。

解决方案 »

  1.   

    你可去搜索一下以前的hook问题,说了很多的,慢慢看!以后有怎么问题也可先搜索一下,避免重复提问!
      

  2.   

    谢谢各位,我就是因为HOOK键盘记录不了才提这个问题的。
      

  3.   

    大富翁离线数据里也有一些hook,说的很具体
    1. 将以下的文字剪贴存成 HKTest.DPR--- Cut Here ---
    library HKTest;uses
    HKProc in 'HKProc.pas';exports
    EnableHotKeyHook,
    DisableHotKeyHook;begin
    hNextHookProc := 0;
    procSaveExit := ExitProc;
    ExitProc := @HotKeyHookExit;
    end.
    --- Cut Here ---
    2. 将以下的文字剪贴存成 HKProc.PAS
    (Note: HKTest.DPR 与 HKProc.PAS 建议储存在同一个目录)--- Cut Here ---
    unit HKProc;interfaceuses
    Windows, Messages;var
    hNextHookProc: HHook;
    procSaveExit: Pointer;function KeyboardHookHandler(iCode: Integer;
    wParam: WPARAM;
    lParam: LPARAM): LRESULT; stdcall; export;
    function EnableHotKeyHook: BOOL; export;
    function DisableHotKeyHook: BOOL; export;
    procedure HotKeyHookExit; far;implementationfunction KeyboardHookHandler(iCode: Integer;
    wParam: WPARAM;
    lParam: LPARAM): LRESULT; stdcall; export;
    const
    _KeyPressMask = $80000000;
    begin
    Result := 0;
    If iCode < 0 Then
    begin
    Result := CallNextHookEx(hNextHookProc, iCode, wParam, lParam);
    Exit;
    end;
    // 侦测 Ctrl + B 组合键
    if ((lParam and _KeyPressMask) = 0) and
    (GetKeyState(vk_Control) < 0) and (wParam = Ord('B')) then
    begin
    Result := 1;
    WinExec('Notepad.exe', sw_Normal); // 记事本
    end;
    end;function EnableHotKeyHook: BOOL; export;
    begin
    Result := False;
    if hNextHookProc <> 0 then Exit;
    // 挂上 WH_KEYBOARD 这型的 HOOK, 同时, 传回值必须保留下
    // 来, 免得 HOOK 呼叫链结断掉
    hNextHookProc := SetWindowsHookEx(WH_KEYBOARD,
    KeyboardHookHandler,
    HInstance,
    0);
    Result := hNextHookProc <> 0;
    end;function DisableHotKeyHook: BOOL; export;
    begin
    if hNextHookProc <> 0 then
    begin
    UnhookWindowshookEx(hNextHookProc); // 解除 Keyboard Hook
    hNextHookProc := 0;
    MessageBeep(0);
    MessageBeep(0);
    end;
    Result := hNextHookProc = 0;
    end;procedure HotKeyHookExit;
    begin
    // 如果忘了解除 HOOK, 自动代理解除的动作
    if hNextHookProc <> 0 then DisableHotKeyHook;
    ExitProc := procSaveExit;
    end;end.
      

  4.   

    用键盘购子时,第一个参数要使用WH_KEYBOARD_LL,而不是WH_KEYBOARD。
    在钩子的回调函数里,参数lParam是一个指向结构KBDLLHOOKSTRUCT的指针。
    每个键被纪录两次,那是因为键按下和松开你都记录了的缘故。判断结构
    KBDLLHOOKSTRUCT的成员 flags,如果有标志 LLKHF_UP,表示键松开,就
    不要纪录了。