如何判断鼠标离开了窗体(包括窗体最上面的状态栏) ( 积分: 100 )

  • 主题发起人 主题发起人 rmb-xp
  • 开始时间 开始时间
R

rmb-xp

Unregistered / Unconfirmed
GUEST, unregistred user!
如题:<br>如何判断鼠标离开了窗体(包括窗体最上面的状态栏)
 
没有好办法。
 
這個簡單,判斷下位置就行了。
 
判断位置的话,是不是下一次鼠标移动到窗体上来才会知道,<br><br>我想鼠标离开马上就需要知道
 
1、定時檢測鼠標位置;2、HOOK鼠標位置;3處理鼠標相關的消息。
 
1&nbsp;占用资源<br>2&nbsp;不在同一个实例<br>3&nbsp;扯谈
 
結合1,3是可以簡單判斷出來的,沒有&nbsp;&nbsp;白河愁&nbsp;&nbsp;說的那麼誇張。<br>在MouseEnter時啟動檢測,檢測到出去則暫停,結合起來資源占用基本可以忽略。就算完全定時檢測資料占用也沒什麼,要做這樣的檢測的程序肯定不會在乎這點CPU占用。
 
Delphi提供了两个消息在鼠标进入或离开控件时响应&nbsp;CM_MOUSEENTER,&nbsp;CM_MOUSELEAVE&nbsp;窗体也是控件。<br><br>unit&nbsp;Unit1;<br><br>interface<br><br>uses<br>&nbsp;&nbsp;Windows,&nbsp;Messages,&nbsp;SysUtils,&nbsp;Variants,&nbsp;Classes,&nbsp;Graphics,&nbsp;Controls,&nbsp;Forms,<br>&nbsp;&nbsp;Dialogs;<br><br>type<br>&nbsp;&nbsp;TForm1&nbsp;=&nbsp;class(TForm)<br>&nbsp;&nbsp;private<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;Private&nbsp;declarations&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;CMMouseLeave(var&nbsp;Message:&nbsp;TMessage);&nbsp;message&nbsp;CM_MOUSELEAVE;<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;CMMouseEnter(var&nbsp;Message:&nbsp;TMessage);&nbsp;message&nbsp;CM_MOUSEENTER;<br>&nbsp;&nbsp;public<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;Public&nbsp;declarations&nbsp;}<br>&nbsp;&nbsp;end;<br><br>var<br>&nbsp;&nbsp;Form1:&nbsp;TForm1;<br><br>implementation<br><br>{$R&nbsp;*.dfm}<br><br>{&nbsp;TForm1&nbsp;}<br><br>procedure&nbsp;TForm1.CMMouseEnter(var&nbsp;Message:&nbsp;TMessage);<br>begin<br>&nbsp;&nbsp;//do&nbsp;anything;<br>&nbsp;&nbsp;{&nbsp;测试&nbsp;}<br>&nbsp;&nbsp;Caption&nbsp;:=&nbsp;'鼠标进入窗体';<br>end;<br><br>procedure&nbsp;TForm1.CMMouseLeave(var&nbsp;Message:&nbsp;TMessage);<br>begin<br>&nbsp;&nbsp;//do&nbsp;anything;<br>&nbsp;&nbsp;{&nbsp;测试&nbsp;}<br>&nbsp;&nbsp;Caption&nbsp;:=&nbsp;'鼠标离开窗体';<br>end;<br><br>end.
 
帮你顶,接个分
 
ANiDelphi:<br>但是如果from上如果有button或是其他控件的话,鼠标移动到其上面也算是离开了窗体。<br><br>有办法解决吗
 
&gt;&gt;包括窗体最上面的状态栏<br>窗体最上面那个不叫“状态栏”,那个叫“标题栏”<br>我记得2ccc.com上有个例子的,类似QQ自动隐藏的&nbsp;,也有判断鼠标在窗口上的位置的。不过如果我没记错的话,那个好像就是用的Timer来判断的。利用PtInRect函数,判断鼠标指针是否在窗体的Rect中。你可以去盒子上找找这个代码,我记得名字好像是“QQ自动隐藏”啥的。
 
那个事件&nbsp;Windows&nbsp;自己都说不一定会发生的。<br>2ccc那个例子烂得很。
 
加个判断就行了,不过这个事件真的有时不灵,比如鼠标移动的快时<br>procedure&nbsp;TForm1.CMMouseLeave(var&nbsp;Message:&nbsp;TMessage);<br>begin<br>&nbsp;&nbsp;//do&nbsp;anything;<br>&nbsp;&nbsp;if&nbsp;not&nbsp;PtInRect(BoundsRect,&nbsp;Mouse.CursorPos)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;Caption&nbsp;:=&nbsp;'鼠标离开窗体';<br>end;
 
多人接受答案了。
 
后退
顶部