假设:
A窗口有一个按钮,鼠标移动到该按钮上,那个按钮会发亮。
请问用sendmessage来发送wm_mousemove怎么实现这种效果,有个前提是,真实的鼠标仍在做它自己的事情。
我的想法是用一个定时线程每30ms往A窗口句柄内的按钮发送wm_mousemove。
但是真实的鼠标仍在做其它的事情,这种30ms  sendmessage一个wm_mousemove与真实的鼠标真的移动在按钮上不动,有什么区别吗?比如在事件上?

解决方案 »

  1.   

    delphi 2006及以上版本,控件有onmousehover(光标悬停在控件区域)、Onmouseenter(进入控件区域)、
    onmouseleave(离开控件区域),如果用delphi7是没有这些事件的,需要自己给控件扩展加入这几个事件。
    加入这几个事件也很简单,不过如果鼠标快速划过控件区域,这几个事件就不太灵光了,这时需要通过trackmouseevent来精确控制。
    var
     tme:ttrackmouseevent; // 定义个全局变量或form的成员
    。// 在form1的oncreate中初始化tme:ttrackmouseevent结构体
    procedure tform1.formcreate(sender: tobject);
    begin
      tme.cbSize := sizeof(ttrackmouseevent);
      tme.dwFlags := tme_leave + tme_hover;//表示要过问leave及hover这两个消息
      tme.hwndTrack := form1.handle;// 关联的窗体句柄
      tme.dwHoverTime := 100; // 关键在此,关联鼠标移动速度,单位毫秒
                              // 即鼠标悬停在控件上超过100毫秒发送wm_mousehover消息,表示鼠标悬停了
    end;// 接下来自己重写窗口过程WndProc,在里面处理鼠标悬停和离开消息
    procedure tform1.wndproc(var m: tmessage);
    begin
      with m do
      begin
        case msg of
          // 鼠标移动消息
          wm_mousemove:
          begin
            trackmouseevent(tme);
          end;       // 鼠标悬浮于窗体
          wm_mousehover:
           begin
             // 这里做你所谓的“发光”的处理 
           end;       // 鼠标离开窗体
           wm_mouseleave:
           begin
            // 这里恢复到未“发光”时的状态 
           end;  
      end;
      inherited wndproc(m);
    end;
      

  2.   

    忘了,是处理按钮的,
    那么相应的,给tme.hwndTrack 指定按钮的窗口句柄 wndproc改用form1.windowproc
    把form1.windowproc指向按钮的windowproc,在里面做同样的处理就可以了
    灭啥时间了,就不写了,LZ自己撸定它吧
      

  3.   

    非常感谢sololie。
    不好意思,我没有表达好我的问题。
    我们打开网页,鼠标移动到 超链接 时,该超链接的文字下方会出现一条线。
    如果我不用鼠标,而是用软件不停的发送wm_mousemove到网页句柄该超链接位置时,下方也会出现一条线。
    我的问题是:即使不用真实的鼠标移动到该超链接,除了不停的发送wm_mousemove有没有其它的办法。
      

  4.   

    我是想实现用Sendmessage发送wm_mousemove来达到与真实鼠标移动到某东西上的效果一样。
      

  5.   

    你在Delphi下,继承TButton写一个自己的控件。然后在其中捕抓所有送进自己控件的消息。
    1.收集总共有多少消息;
    2.分辨什么消息,在什么情况下,产生什么结果。
    用这个在Delphi下反复测试,
    最后在你要的环境下看看达到你要的结果没有。
      

  6.   

    计算该按钮的位置,组装成WM_MOUSEMOVE消息,发送