Delphi检测鼠标是否超过表单的关闭按钮

时间:2017-03-06 23:36:17

标签: forms delphi mouseover

我想检测用户是否点击了我的应用程序内的非活动表单上的关闭按钮。如何检测鼠标悬停在表单的关闭按钮上,以便在表单关闭时我可以使用该数据?

1 个答案:

答案 0 :(得分:6)

您可以在表单的窗口中发送WM_NCHITTEST消息,并将鼠标的屏幕坐标传递到lParam值。如果返回值为HTCLOSE,则鼠标位于“关闭”按钮上。

但是,仅仅因为鼠标悬停在关闭按钮上并不能保证用户实际点击了该按钮。例如,用户可以将鼠标移到按钮上,然后在键盘上键入 Alt + F4 (或 Alt + Space ,向下箭头指向{{1} }选项,然后按 Enter ,它将调用与 Alt + F4 相同的操作。

无论是点击“关闭”按钮,还是使用键盘快捷键,都会向窗口发送相同的WM_CLOSE消息(触发表单的CloseOnCloseQuery个事件) ,并且它不报告为什么窗口正在关闭。

如果您需要区分,可以让表单处理WM_NCLBUTTONDOWN / WM_NCLBUTTONUPWM_SYSCOMMAND窗口消息。关闭窗口时,点击其关闭按钮,OnClose前面会WM_CLOSEWM_NCLBUTTON...设置为wParam。通过键盘快捷键关闭窗口时,HTCLOSE前面会WM_CLOSE,其WM_SYSCOMMAND设置为wParam