鼠标钩子的细节问题
我定义了一个全局的鼠标钩子
基本上的功能是没有什么问题的
但是,现在还想解决两个细节问题:
1、我想让只鼠标消息发送到我的窗口,然后把它丢掉,该怎么办?
(关键是如何让消息不发送到它原来的窗体,直接丢掉)
2、我想让鼠标的光标形状变成手型光标,该怎么做?
(我试过用Screen.Cursor:=crHandPoint是不行的)
问题点数:100、回复次数:6Top
1 楼hansome(连环)回复于 2002-11-25 15:49:57 得分 0
怎么,没有高手在吗?Top
2 楼stanely(俺是邢她汉子)回复于 2002-11-26 11:50:10 得分 50
1。用鼠标钩子,在回调函数里面监测鼠标下面的窗口是不是你的窗口,如果不是,那么result:=-1否则:=0
监测鼠标下的窗口,可以使用getcursorpos,windowfrompoint来得到窗口句柄,然后跟findwindow的结果比较。Top
3 楼hansome(连环)回复于 2002-11-26 15:19:26 得分 0
还有鼠标的光标形状如何改变Top
4 楼Fzgta(蝈蝈)回复于 2002-11-26 17:55:17 得分 10
hCursor:=LoadCursorFromFile(...)
SetCursor(hCursor);
一切OK!
Top
5 楼lxlzq(石头)回复于 2002-11-27 14:31:04 得分 40
result的值不要设为0
比如:result:=1;Top
6 楼zhangleivip(coolbee)回复于 2003-03-27 17:48:38 得分 0
我也做了一个鼠标钩子,但是只有在鼠标经过当前程序窗体的时候才有效
感觉并不是全局的,我的钩子函数和过程是写在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;Top




