Delphi 检测鼠标是否悬停在表单的关闭按钮上

Delphi Detect if mouse over form's close button

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

您可以向表单的 window 发送一条 WM_NCHITTEST 消息,在 lParam 值中传递鼠标的屏幕坐标。如果 return 值为 HTCLOSE,则鼠标悬停在关闭按钮上。

但是,仅仅因为鼠标悬停在关闭按钮上并不能保证用户确实单击了该按钮。例如,用户可以将鼠标移到按钮上,然后在键盘上键入 Alt+F4(或 Alt+Space , 向下箭头到 Close 选项,然后按 Enter,这将调用与 Alt+F4).[=31 相同的操作=]

无论是单击“关闭”按钮还是使用键盘快捷键,都会将相同的 WM_CLOSE 消息发送到 window(触发表单的 OnCloseQueryOnClose事件),并且它不报告 为什么 window 被关闭。

如果您需要区分,可以让您的表单处理 WM_NCLBUTTONDOWN/WM_NCLBUTTONUP and WM_SYSCOMMAND window 消息。当通过单击其关闭按钮关闭 window 时,WM_CLOSE 将在 WM_NCLBUTTON... 前面加上 wParam 设置为 HTCLOSE。当通过键盘快捷键关闭 window 时,WM_CLOSE 前面会有 WM_SYSCOMMAND,其 wParam 设置为 SC_CLOSE