我想检测用户是否点击了我的应用程序内的非活动表单上的关闭按钮。如何检测鼠标悬停在表单的关闭按钮上,以便在表单关闭时我可以使用该数据?
答案 0 :(得分:6)
您可以在表单的窗口中发送WM_NCHITTEST
消息,并将鼠标的屏幕坐标传递到lParam
值。如果返回值为HTCLOSE
,则鼠标位于“关闭”按钮上。
但是,仅仅因为鼠标悬停在关闭按钮上并不能保证用户实际点击了该按钮。例如,用户可以将鼠标移到按钮上,然后在键盘上键入 Alt + F4 (或 Alt + Space ,向下箭头指向{{1} }选项,然后按 Enter ,它将调用与 Alt + F4 相同的操作。
无论是点击“关闭”按钮,还是使用键盘快捷键,都会向窗口发送相同的WM_CLOSE
消息(触发表单的Close
和OnCloseQuery
个事件) ,并且它不报告为什么窗口正在关闭。
如果您需要区分,可以让表单处理WM_NCLBUTTONDOWN
/ WM_NCLBUTTONUP
和WM_SYSCOMMAND
窗口消息。关闭窗口时,点击其关闭按钮,OnClose
前面会WM_CLOSE
,WM_NCLBUTTON...
设置为wParam
。通过键盘快捷键关闭窗口时,HTCLOSE
前面会WM_CLOSE
,其WM_SYSCOMMAND
设置为wParam
。