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

Emr*_*goz 1 forms delphi mouseover

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

Rem*_*eau 6

您可以向表单窗口WM_NCHITTEST发送消息,将鼠标的屏幕坐标传递给lParam值.如果返回值为HTCLOSE,则鼠标位于"关闭"按钮上方.

但是,仅仅因为鼠标位于"关闭"按钮上并不能保证用户实际点击了该按钮.例如,用户可以将鼠标移到按钮上,然后Alt+F4在键盘上键入(或者Alt+Space,向下箭头键入Close选项,然后按Enter,调用相同的操作Alt+F4).

无论点击关闭按钮,或者使用键盘快捷键,同样的WM_CLOSE消息被发送到窗口(触发窗体的OnCloseQueryOnClose事件),并且它不报告为何被关闭该窗口.

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