|
21个滑鼠讯息中的20个,最後一个讯息是WM_NCHITTEST,它代表「非显示区域命中测试」。此讯息优先於所有其他的显示区域和非显示区域滑鼠讯息。lParam参数含有滑鼠位置的x和y萤幕座标,wParam参数没有用。
Windows应用程式通常把这个讯息传送给DefWindowProc,然後Windows用WM_NCHITTEST讯息产生与滑鼠位置相关的所有其他滑鼠讯息。对於非显示区域滑鼠讯息,在处理WM_NCHITTEST时,从DefWindowProc传回的值将成为滑鼠讯息中的wParam参数,这个值可以是任意非显示区域滑鼠讯息的wParam值再加上以下内容:
| HTCLIENT
HTNOWHERE
HTTRANSPARENT
HTERROR |
显示区域
不在视窗中
视窗由另一个视窗覆盖
使DefWindowProc产生警示用的哔声 |
如果DefWindowProc在其处理WM_NCHITTEST讯息後传回HTCLIENT,那么Windows将把萤幕座标转换为显示区域座标并产生显示区域滑鼠讯息。
如果您还记得我们如何通过拦截WM_SYSKEYDOWN讯息来停用所有的系统键盘功能,那么您可能会想我们可否通过拦截滑鼠讯息完成类似的事情。完全可以!只要您在视窗讯息处理程式中包含以下几条叙述:
case WM_NCHITTEST: return (LRESULT) HTNOWHERE ;
就可以有效地禁用您视窗中的所有显示区域和非显示区域滑鼠讯息。这样一来,当滑鼠在您的视窗(包括系统功能表图示、缩放按钮以及关闭按钮)中时,滑鼠按键将会失效。
从讯息产生讯息
Windows用WM_NCHITTEST讯息产生所有其他滑鼠讯息,这种由讯息引出其他讯息的想法在Windows中是很普遍的。让我们来举个例子。您知道,如果您在一个Windows程式的系统功能表图示上双击一下,那么程式将会终止。双击产生一系列的WM_NCHITTEST讯息。由於滑鼠定位在系统功能表图示上,因此DefWindowProc将传回HTSYSMENU的值,并且Windows把wParam等於HTSYSMENU的WM_NCLBUTTONDBLCLK讯息放在讯息伫列中。
视窗讯息处理程式通常把滑鼠讯息传递给DefWindowProc,当DefWindowProc接收到wParam |