大家帮我看看,我想通过截获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;

解决方案 »

  1.   

    试一下截获CM_MOUSELEAVE和CM_MOUSEENTER
      

  2.   

    谢谢,现在可以正常响应了
    但是窗口改变的时候会很闪
    是不是WM_NCMOUSEMOVE也要变一下我是过WM_MOUSEMOVE也很闪,我的窗口上有一些输入框之类
      

  3.   

    应该不需要处理WM_NCMOUSEMOVE吧
      

  4.   

    我自己写了个hook,但是调用起来就是不成功,大家帮我看看
    网上说在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.
      

  5.   

    其实用一个Timer,再加上GetCursorPos这个函数就可以了