hook问题:设置全局hook,过程要在DLL中,但不能把全部东西都放在DLL中吧,还有主程序,当钩子函数得到一些信息要传给主程序进一步处理时,要如何做呢,有没有办法做一个回调函数,在主程序中返回信息,或有其它方法和主程通讯,
以前用VB,但不能做全局hook,这两天刚温习了一下delphi,所以不太熟,不知道有没有方法,可以在DLL中返回信息到主程序中。就好象windows回调函数一样
望delphi大侠多多指教,先谢了

解决方案 »

  1.   

    用进程之间的通讯办法,例如 内存文件映射,WM_COPYDATA,或发送自定义消息等办法
      

  2.   

    library hook;uses
      Windows,
      Messages,
      SysUtils,
      Dialogs,
      HookType;var
      MemFile: THandle;
      Shared: PShared;{$R *.res}function ShellProc(iCode: Integer; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
    begin
      case iCode of
        HSHELL_WINDOWCREATED:
        begin
          PostMessage(Shared^.MainWnd,WM_USERCMD ,UC_WINCREATE,wParam);
        end;
      end;
      Result := CallNextHookEx(Shared^.ShellHook,iCode,wParam,lParam);
    end;function InstallHook:Boolean;
    begin
      Shared^.Moudle:= hInstance;
      Shared^.ShellHook := SetWindowsHookEx(WH_SHELL, @ShellProc, Shared^.Moudle, 0);
      if Shared^.KeyHook = 0 then
      begin
        Result := False;
        Exit;
      end;
      Result := true;
    end;function uninstallhook:boolean;stdcall;
    begin
    result:=unhookwindowshookex(Shared^.ShellHook);
    end;procedure DllEntry(dwReason : integer);
    begin
      case dwReason Of
        DLL_PROCESS_ATTACH:
          begin
            MemFile := OpenFileMapping(FILE_MAP_WRITE,False,HOOK_MEM_FILENAME);
            if MemFile = 0 then
              MemFile := CreateFileMapping($FFFFFFFF,nil,
                PAGE_READWRITE,
                0,
                SizeOf(TShared),
                HOOK_MEM_FILENAME);
            Shared := MapViewOfFile(MemFile,
              File_MAP_WRITE,
              0,
              0,
              0);
          end;
        DLL_PROCESS_DETACH:
          begin
            //
          end;
        else;
      end;
    end;exports
      InstallHook,
      uninstallhook;begin
      DllProc := @DllEntry;
      DllEntry(DLL_PROCESS_ATTACH);
    end.
      

  3.   

    主程序function InstallHook: boolean; stdcall; external 'hook.dll';
    function UninstallHook: Boolean; stdcall; external 'hook.dll';MemFile := OpenFileMapping(FILE_MAP_WRITE,False,HOOK_MEM_FILENAME);
      if MemFile = 0 then
      MemFile := CreateFileMapping($FFFFFFFF,nil,
                PAGE_READWRITE,
                0,
                SizeOf(TShared),
                HOOK_MEM_FILENAME);
      Shared := MapViewOfFile(MemFile,
              File_MAP_WRITE,
              0,
              0,
              0);
      Shared^.MainWnd := Handle;————————————————————————————————————
    这就是你所说的响应部分吧?!
    procedure TForm1.WndProc(var Msg: TMessage);
    begin
     with Msg do
     begin
       if Msg = WM_usercmd then
       begin     case wParam of
           UC_WINCREATE :
           begin
             if findwindow(nil,'AutoCAD 2002')<>0 then
                showmessage('find autocad')
             //证明有应用程序创建了,这里是你的处理(如你可以记录什么时候应用程序启动了)。
           end;
         end;
       end;
     end;
     inherited;
    end;没头没脑 贴段代码 希望有些帮助
      

  4.   

    少了个单元unit HookType;interfaceuses
      Windows, Messages;const
      WM_USERCMD   = WM_APP + 1;
      UC_WINCREATE = WM_APP + 2;
      BUFFER_SIZE  = 16 * 1024;
      HOOK_MEM_FILENAME = 'acad.exe';
    type
      TShared = record
        KeyHook  :HHook;
        ShellHook:HHook;
        CallHook :HHook;
        MainWnd  :THandle;
        Moudle   :THandle;
      end;
      PShared = ^TShared;implementationend.
      

  5.   

    全局hook回调函数不能放在主程序中,只是通讯是可以实现的.
      

  6.   

    如果数据够少,用SendMessage即可。
      

  7.   

    DLL中得到信息要返回给主程序,通过设定回调激发主程序的某些动作,这是难以做到的。
    原因很简单,DLL怎么调用主程序的过程?
    只是要达到信息传递的效果,可以使用共享数据区。
    要主程序对DLL的信息实时响应,需要设定消息触发主程序动作。
      

  8.   

    主程序一开始就把handle发给dll,然后需要调用时给主程序发送自定义消息就OK了!我做的低级键盘钩子和低级鼠标钩子都是这么和主程序通讯的,呵呵!
      

  9.   

    安装hook的时候把你的回掉函数地址 传递即可