有谁做过MouseHook的Dll吗?能不能支持一个,我这几急着用。
谢谢了。
e-mail:[email protected]

解决方案 »

  1.   

    我把我做的一个HOOK DLL改了一下,只是一个框架,你再扩展一下吧.library Hook;uses
      SysUtils,windows, Messages;type
      PMyDLLVar = ^TMyDLLVar;
      TMyDLLVar = record
        HookWindow, SpyWindow: LongWORD;   //要安装HOOK的窗口及用于接收消息的窗口
        hHook: LongWORD;  //HOOK句柄
        MsgHwnd: LongWORD;
        Msg: TMessage;
      end;var
      DLLData: PMyDLLVar;{------------------------------------}
    {过程名:HookProc
    {过程功能:HOOK过程
    {过程参数:nCode, wParam, lParam消息的相
    {         关参数
    {------------------------------------}
    procedure HookProc(nCode, wParam, lParam: LongWORD);stdcall;
    begin
      //加上你要做的功能
      //调用下一个Hook
      CallNextHookEx(DLLData^.hHook, nCode, wParam, lParam);
    end;
    {------------------------------------}
    {函数名:InstallHook
    {函数功能:在指定窗口上安装HOOK
    {函数参数:HWindow:要安装HOOK的窗口
    {         SWindow:用于接收消息的窗口
    {返回值:成功返回TRUE,失败返回FALSE
    {------------------------------------}
    function InstallHook(HWindow, SWindow: LongWORD):Boolean;stdcall;
    var
      ThreadID: LongWORD;
    begin
      Result := False;
      DLLData^.hHook := 0;
      DLLData^.HookWindow := HWindow;
      DLLData^.SpyWindow := SWindow;
      ThreadID := GetWindowThreadProcessId(HWindow, nil);
      //给指定窗口挂上钩子
      DLLData^.hHook := SetWindowsHookEx(WH_MOUSE, @HookProc, Hinstance, ThreadID);
      if DLLData^.hHook > 0 then Result := True;  //是否成功HOOK
    end;{------------------------------------}
    {过程名:UnHook
    {过程功能:卸载HOOK
    {过程参数:无
    {------------------------------------}
    procedure UnHook;stdcall;
    begin
      //先做其它卸载工作
      //卸载Hook
      UnhookWindowsHookEx(DLLData^.hHook);
    end;{------------------------------------}
    {过程名:DLL入口函数
    {过程功能:进行DLL初始化,释放等
    {过程参数:DLL状态
    {------------------------------------}
    procedure MyDLLHandler(Reason: Integer);
    var
      FHandle: LongWORD;
    begin
      case Reason of
        DLL_PROCESS_ATTACH:
        begin            //建立文件映射,以实现DLL中的全局变量
          FHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, $ff, 'MYDLLDATA');
          if FHandle = 0 then
          if GetLastError = ERROR_ALREADY_EXISTS then
          begin
            FHandle := OpenFileMapping(FILE_MAP_ALL_ACCESS, False, 'MYDLLDATA');
            if FHandle = 0 then Exit;
          end else Exit;
          DLLData := MapViewOfFile(FHandle, FILE_MAP_ALL_ACCESS, 0, 0, 0);
          if DLLData = nil then
            CloseHandle(FHandle);
        end;
        DLL_PROCESS_DETACH:
          if Assigned(DLLData) then
          begin
            UnmapViewOfFile(DLLData);
            DLLData := nil;
          end;
        DLL_THREAD_ATTACH:;
        DLL_THREAD_DETACH:;
      end;
    end;{$R *.res}
    exports
      InstallHook, UnHook, HookProc;begin
      DLLProc := @MyDLLHandler;
      MyDLLhandler(DLL_PROCESS_ATTACH);
    end.