我定义了一个全局的鼠标钩子
基本上的功能是没有什么问题的
但是,现在还想解决两个细节问题:
1、我想让只鼠标消息发送到我的窗口,然后把它丢掉,该怎么办?
   (关键是如何让消息不发送到它原来的窗体,直接丢掉)
2、我想让鼠标的光标形状变成手型光标,该怎么做?
   (我试过用Screen.Cursor:=crHandPoint是不行的)

解决方案 »

  1.   

    1。用鼠标钩子,在回调函数里面监测鼠标下面的窗口是不是你的窗口,如果不是,那么result:=-1否则:=0监测鼠标下的窗口,可以使用getcursorpos,windowfrompoint来得到窗口句柄,然后跟findwindow的结果比较。
      

  2.   

    hCursor:=LoadCursorFromFile(...)
    SetCursor(hCursor);
    一切OK!
      

  3.   

    result的值不要设为0
    比如:result:=1;
      

  4.   

    我也做了一个鼠标钩子,但是只有在鼠标经过当前程序窗体的时候才有效
    感觉并不是全局的,我的钩子函数和过程是写在DLL里的,帮忙看看
    //处理MouseHOOK的函数
    function MouseHookHandler(icode:integer;wparam:wparam;lparam:lparam):lresult;stdcall;export;
    var
      MP:PMouseHookStruct;
    begin
      if iCode < 0 then
        Result := CallNextHookEx(MouseNextHookProc, iCode, wParam, lParam)
      else begin
          if (wParam=WM_MOUSEMOVE) then  begin    //只处理鼠标移动消息
            MP := PMouseHookStruct(lparam);
            Form1.Caption := inttostr(MP^.pt.X)+'   '+inttostr(MP^.pt.Y);
            //PostMessage(GlobalData.hHandle,WM_MOUSEHOOK,MP^.pt.X,MP^.pt.Y);   //把坐标传过去
          end;
          iCode:=-1;
          Result := CallNextHookEx(MouseNextHookProc, iCode, wParam, lParam);    //调用下一个函数
      end;
    end;function SetMouseHook:bool;export;
    begin
      Result := False;
      if MouseNextHookProc <> 0 then Exit;
      MouseNextHookProc := SetWindowsHookEx(WH_MOUSE,MouseHookHandler,HInstance,0);
      Result := MouseNextHookProc <> 0;  Form1 := TForm1.Create(nil);
      Form1.Show;
    end;function EndMouseHook:bool;export;
    begin
      if MouseNextHookProc <> 0 then
      begin
        UnhookWindowshookEx(MouseNextHookProc);
        MouseNextHookProc := 0;
        MessageBeep(0);
      end;
      Result := MouseNextHookProc = 0;
      Form1.Close;
      Form1.Free;  
    end;