我写了一个鼠标钩子的DLL,但是只有在主程序的窗口上移动鼠标才有响应,离开主程序窗口就没有反应了,这是为什么啊?
我把我写的DLL得一部分代码写出来,哪位高手给我看看阿。
function EnableMouseHook(const wnd:integer):BOOL;stdcall;export;
begin
  result:=false;
  OwnerHwnd:=wnd;
  if hNextHookProc<>0 then exit;
  hNextHookProc:=SetWindowsHookEx(WH_MOUSE,MouesProc,hInstance,0);
  result:=hNextHookProc<>0;
end;
//OwnerHwnd保存得主窗口的句柄
function MouesProc(iCode : Integer;wParam : WPARAM;lParam : LPARAM):LRESULT;stdcall;export;
var
  MouseHookStruct: ^TMOUSEHOOKSTRUCT;
  str:array[0..254] of char;
  Wnd:integer;
  currPoint:TPoint;
begin
   MouseHookStruct:=pointer(lParam);
   if   iCode>=0 then
   begin
     Wnd:=MouseHookStruct.hwnd;
     GetWindowText(Wnd,str,255);
     sendmessage(OwnerHwnd,WM_SETTEXT,length(string(str)),longint(pchar(string(str))));
   end;
   result:=CallNextHookEx (hNextHookProc,iCode,wParam,lParam);
end;

解决方案 »

  1.   

    我用VC写过钩子
    VC在调试状态下是这样的
    你直接点击exe运行试试看
      

  2.   

    sendmessage(OwnerHwnd,WM_SETTEXT,length(string(str)),longint(pchar(string(str))));
    你是在给主窗体发消息吧
    还有
    Wnd:integer;
    我觉得应改为
    Wnd:Handle;
    sendmessage(Wnd,WM_SETTEXT,length(string(str)),longint(pchar(string(str))));
      

  3.   

    钩子其实已经安装成功了,关键在于OwnerHwnd的值变为了0~~~
      

  4.   

    ehom(?!) :
    我也觉得是OwnerHwnd的问题,因为我向鼠标坐标所在窗口发消息是对的
    sendmessage(MouseHookStruct.hwnd,WM_SETTEXT,length(string(str)),longint(pchar(string(str))));
    在vc的例子中是用
    #pragma data_seg("mydata") 关键字定义的句柄变量,
    请问,在delphi中怎样解决呢?
      

  5.   

    ehom(?!) :
    确如你所说,OwnerHwnd变为0了,但是为什么呢?
    帮帮忙吧,谢谢了
      

  6.   

    可能是由于回调函数的某些特性造成的1.不用传递句柄,利用FindWindows,FindWindow等API动态获得2.在DLL中封装窗体,直接在上面显示信息
      

  7.   

    呵呵,建议楼主再发一个帖子问一下delphi中如何定义共享数据段
    事先声明,我不会
      

  8.   

    http://www.galesoft.net
    我刚放上了各种钩子的实现源码