钩子能够实现,但是只能响应调用程序的消息,下面是我的dll代码,是不是问题出在这里?
//----------------------------- 库工程 ----------------------------------
library MouseHook;uses
  SysUtils,
  Classes,
  Code_MouseHookDll in 'Code_MouseHookDll.pas';{$R *.res}exports
  //输出的函数
  EnableMouseHook, //开启鼠标钩子
  DisableMouseHook; //停止鼠标钩子beginend.//----------------------------- 库代码单元 -----------------------------
unit Code_MouseHookDll;interfaceuses
  Windows, Messages, Dialogs, Classes;var
  hMouseHook: HHOOK;  //鼠标钩子句柄
  RecordFile: string; //记录文件的完整路径文件名function EnableMouseHook(AFileName: string): boolean; stdcall; export;
//调用方式:导出,外部程序调用
//功能:开启鼠标钩子
//返回:开启是否成功function DisableMouseHook(): boolean; stdcall; export;
//调用方式:导出,外部程序调用
//功能:关闭鼠标钩子
//返回:是否成功function MouseHookProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM):
  LRESULT; stdcall;
//调用方式:内部函数,由SetWindowsHookEx调用
//功能:鼠标钩子回调函数
//参数:nCode,Hook标志,1存在,0不存在;
//      WParam,鼠标消息;
//      LParam,鼠标信息结构;
//返回:如果不是0的话windows就把这个消息丢掉,其它的程序就不会再收到这个消息。implementation//------------------------------------------------------------------------------
function EnableMouseHook(AFileName: string): boolean; stdcall; export;
begin
  RecordFile := AFileName;
  if hMouseHook = 0 then //为了安全,必须判断一下再设置钩子。
  begin
    // 第三个参数的Hinstance 在Delphi中有定义,用就可以了。第四个参数必须为0
    hMouseHook := SetWindowsHookEx(WH_MOUSE,@MouseHookProc,Hinstance,0);
    AddToFile('Started!');
    Result := True;
  end
  else
    Result := False;
end;//------------------------------------------------------------------------------
function DisableMouseHook(): boolean; stdcall; export;
begin
  if hMouseHook <> 0 then //如果有钩子就卸掉。
  begin
    UnHookWindowsHookEx(hMouseHook);
    hMouseHook := 0;
    AddToFile('Stopped');
    Result := True;
  end
  else
    Result := False;
end;//------------------------------------------------------------------------------
function MouseHookProc(nCode: Integer; WParam: WPARAM; LParam: LPARAM):
  LRESULT; stdcall;
begin
  Result := 0;
  if nCode < 0 then
    //有其它的钩子,参数传给他。
    //让函数CallNextHookEx调用下一个钩子
    Result := CallNextHookEx(hMouseHook,nCode,WParam,LParam)
  else if wParam = WM_LBUTTONDOWN then //判断鼠标是否单击
  begin
    //相应处理函数
  end;
end;end.

解决方案 »

  1.   

    定义在dll中的应该是全局的。
      

  2.   

    同意楼上 另:
    ----在程序初始化的时候,调用函数SetWindowsHookEx安装勾子。其函数原型为: HHOOK SetWindowsHookEx
    ( int idHook,HOOKPROC lpfn, 
    INSTANCE hMod,DWORD dwThreadId   )----参数idHook表示勾子类型,它是和勾子函数类型一一对应的。比如,WH_KEYBOARD表示
    安装的是键盘勾子,WH_MOUSE表示是鼠标勾子等等。 ----Lpfn是勾子函数的地址。 ----HMod是勾子函数所在的实例的句柄。对于线程勾子,该参数为NULL;对于系统勾子,该
    参数为勾子函数所在的DLL句柄。 ---- dwThreadId 指定勾子所监视的线程的线程号。对于全局勾子,该参数为NULL。 ----SetWindowsHookEx返回所安装的勾子句柄。 
      

  3.   

    1.全局的
    2.将library MouseHook;中的
    //begin
    //end.
    改成
    begin
       hMousehook:=0;
       procsaveexit:=exitproc;//保存返回地址
       exitproc:=@Mousehookexit;//退出处理
    end.
    3.Code_MouseHookDll.pas
    //var
    //  hMouseHook: HHOOK;  
    改成
    var
         hMouseHook: HHOOK;  
         procsaveexit:pointer;//声明procsaveexit
    增加
    procedure Mousehookexit;
    begin
       if hMouseHook〈〉0 then
         disablemousehook;
         exitproc:=procsaveexit;//恢复
    end;   
      

  4.   

    我终于知道了为什么了!
    费了我半天的时间
    不过引出了另一个问题——怎么定义dll全局变量?static?
      

  5.   

    MouseHook不需要用dll也能实现全局 呵呵
      

  6.   

    //我想原因出在nCode上了,帮助上说<0时要调用CallNextHookEx,但并没有说这不是鼠标消息,事实上其他程序的鼠标消息被你过滤掉了.  if wParam = WM_LBUTTONDOWN then //判断鼠标是否单击
      begin
        //相应处理函数  end;  if nCode < 0 then
      begin
        Result := CallNextHookEx(hMouseHook,nCode,WParam,LParam)
      end