大家帮我看看,我想通过截获WM_MOUSEHOVER和WM_MOUSELEAVE消息来判断鼠标是否在窗口上
但是像我如下这么写之后只有WM_MOUSELEAVE被响应,而WM_MOUSEHOVER却没有反应
即使你强制发送OnMove.dwFlags := TME_HOVER;也是如此
为什么呢
要达到我所说的效果最好的办法是什么呢??这是声明函数
procedure WindowMouseLeave(var Message:TMessage); message WM_MOUSELEAVE;
procedure WindowMouseOver(var Message:TMessage); message WM_MOUSEHOVER;
procedure WindowMouseMove(var Message:TMessage); message WM_NCMOUSEMOVE;
这是响应函数
//---------------------------------------------------------------------------
procedure TMyForm.WindowMouseMove(var Message:TMessage);
var
OnMove: TTRACKMOUSEEVENT;
begin
OnMove.cbSize := sizeof(OnMove);
OnMove.dwFlags := TME_HOVER or TME_LEAVE;
OnMove.hwndTrack := Handle;
OnMove.dwHoverTime := 1;
TrackMouseEvent(OnMove);
end;//---------------------------------------------------------------------------
procedure TMyForm.WindowMouseLeave(var Message:TMessage);
var
OnLeave: TTRACKMOUSEEVENT;
begin
IsCatch := false;
ShowMessage('LEAVE');
end;//---------------------------------------------------------------------------
procedure TMyForm.WindowMouseOver(var Message:TMessage);
var
OnOver: TTRACKMOUSEEVENT;
begin
IsCatch := true;
ShowMessage('HOVER');
end;
但是像我如下这么写之后只有WM_MOUSELEAVE被响应,而WM_MOUSEHOVER却没有反应
即使你强制发送OnMove.dwFlags := TME_HOVER;也是如此
为什么呢
要达到我所说的效果最好的办法是什么呢??这是声明函数
procedure WindowMouseLeave(var Message:TMessage); message WM_MOUSELEAVE;
procedure WindowMouseOver(var Message:TMessage); message WM_MOUSEHOVER;
procedure WindowMouseMove(var Message:TMessage); message WM_NCMOUSEMOVE;
这是响应函数
//---------------------------------------------------------------------------
procedure TMyForm.WindowMouseMove(var Message:TMessage);
var
OnMove: TTRACKMOUSEEVENT;
begin
OnMove.cbSize := sizeof(OnMove);
OnMove.dwFlags := TME_HOVER or TME_LEAVE;
OnMove.hwndTrack := Handle;
OnMove.dwHoverTime := 1;
TrackMouseEvent(OnMove);
end;//---------------------------------------------------------------------------
procedure TMyForm.WindowMouseLeave(var Message:TMessage);
var
OnLeave: TTRACKMOUSEEVENT;
begin
IsCatch := false;
ShowMessage('LEAVE');
end;//---------------------------------------------------------------------------
procedure TMyForm.WindowMouseOver(var Message:TMessage);
var
OnOver: TTRACKMOUSEEVENT;
begin
IsCatch := true;
ShowMessage('HOVER');
end;
但是窗口改变的时候会很闪
是不是WM_NCMOUSEMOVE也要变一下我是过WM_MOUSEMOVE也很闪,我的窗口上有一些输入框之类
网上说在dll中调用setWindowsHookEx函数要事先声明,是这样吗
library mousehook;uses
SysUtils, WinTypes, WinProcs, Messages, Classes;const
WM_HASLEAVE = WM_USER+1;
WM_HASHOVER = WM_USER+2;//声明变量和函数
var
idhook:longint;
displyHandle: HWND; //默认窗口句柄
NowFcsCaption: String; //当前窗口标题
//------------------------------------------------------------------------
//安装鼠标钩子函数mouseProc
function hook(myHandle: HWND):bool;stdcall;
var
hinst:thandle; //该动态连接库自己的模块局柄
proc:tfarproc; //鼠标钩子函数mouseProc的地址
begin
//装载钩子
hinst := getModuleHandle('mousehook');
proc := getProcAddress(hinst,'mouseProc');
idhook:= setWindowsHookEx(WH_MOUSE,proc,hinst,0);//根据返回状态状态获知是否安装成功
if idhook =0 then hook:=false else hook:=true;
end;//------------------------------------------------------------------------
//解除鼠标钩子函数mouseProc的安装
function unhook:bool;stdcall;
begin
if idhook=0 then
begin
unhook := false;
exit;
end;
unhookWindowsHookEx(idhook);
unhook := true;
end;//------------------------------------------------------------------------
//mouseProc不由应用程序调用,而是在鼠标移动后,由系统调用
function mouseProc(code:Integer; wparam:WPARAM; lparam:LPARAM):bool;stdcall;
var
pMouseHook:^TMouseHookStruct;
pMemo:pchar;
targetHandle: HWND; //目标窗口句柄
parentHandle: HWND; //目标主窗口句柄
begin
//如果调用不成功则继续调用
if(code < 0) then
begin
mouseProc := true;
CallNextHookEx(idhook,0,wparam,lparam);
end;mouseProc := false;//取主窗口句柄
pMouseHook := ptr(lparam);
targetHandle := pMouseHook^.hwnd;
parentHandle := targetHandle;
while parentHandle <> 0 do
begin
targetHandle := parentHandle;
parentHandle := GetParent(targetHandle);
end;if(targetHandle <> displyHandle) then
SendMessage(displyHandle,WM_HASLEAVE,0,0)
else SendMessage(displyHandle,WM_HASHOVER,0,0);
getWindowText(targetHandle,pMemo,100);NowFcsCaption := strPas(pMemo);
strDispose(pMemo); //清除文字
end;exports
hook,unhook;
end.