关于鼠标输入
鼠标是一个重要的,但可选的输入设备,好的应用程序应该包括鼠标接口,但不应该把鼠标作为唯一的输入设备,而也应该提供完备的键盘支持。
应用程序是以接收发送到或者投递到窗口的消息的方式获取鼠标输入的。
本节包含以下内容:
- 鼠标光标
- 鼠标捕获
- 鼠标单击锁
- 鼠标设置
- XBUTTONs
- 鼠标消息
- 鼠标声纳
- 隐藏鼠标
- 鼠标滚轮
- 窗口激活
鼠标光标
当用户移动鼠标时,系统屏幕上的一个图形也跟着移动,这个图形就叫做鼠标光标。鼠标光标包含一个单像素的点称为热点,系统根据该点移动或识别光标位置。当产生鼠标事件时,包含热点的窗口就会收到事件所产生的消息。接收消息的窗体没有必要是激活的窗体,或者获取了键盘焦点。
系统维护着控制鼠标移动速度的变量—也就是,用户移动鼠标时,光标所移动的距离。 可以使用SystemParametersInfo 函数并指定SPI_GETMOUSE或SPI_SETMOUSE标志以获取或设置鼠标速度。更多关于光标的信息,请参见“光标”。
鼠标捕获
当发生鼠标事件时,系统通常会把一个鼠标消息发送到包含鼠标热点的窗体中,应用程序可以通过使用SetCapture函数把鼠标信息转而传递给指定的窗口。在调用ReleaseCapture或者指定另外一个捕获窗体,更一般的情况是用户点击了其他线程创建的窗体前,该窗口就会接收所有的鼠标信息。
鼠标捕获改变时,系统就会给失去捕获的窗口发送 WM_CAPTURECHANGED消息。消息的lParam参数为获得捕获的窗体句柄。
只有前台的窗体才可以捕获鼠标输入,如果后台窗体尝试捕获的话,只有热点在窗体的可见部分时才会引发鼠标事件消息。
如果一个窗体必须接收所有的鼠标事件,即便光标移到了窗口之外,捕获鼠标输入就很有用了。例如,涌涌程序可能会跟踪按下一个鼠标键后的光标位置,跟着光标移动鼠标,直到释放鼠标键。如果应用程序没有捕获鼠标输入的话,用户在窗体外释放鼠标键时,该窗体就不会收到button-up消息了。
线程中可以使用GetCapture函数确定是否有一个它的窗口正在捕获鼠标,如果发现一个窗口正在捕获的话,GetCapture函数就会获取该窗口的句柄。
鼠标单击锁
鼠标单击锁(ClickLock)是Microsoft® Windows® Millennium Edition (Windows Me)及Windows XP中新增的辅助选项,该功能允许用户点击主键后锁定为按下状态,对于应用程序来说该键看起来是按下去的,应用程序可以通过发送任意的鼠标消息或用户单击任意键来释放该键。该特点可以使得用户做复杂的鼠标组合时变得简单。如,突出显示、拖拽或者打开菜单时就会很容易。更多信息,请参阅SystemParametersInfo及如下标志的详细描述:
- SPI_GETMOUSECLICKLOCK
- SPI_SETMOUSECLICKLOCK
- SPI_GETMOUSECLICKLOCKTIME
- SPI_SETMOUSECLICKLOCKTIME
鼠标设置
尽管鼠标是一个重要的输入设备,但并不是每个用户都需要鼠标。应用程序通过调用GetSystemMetrics函数,并传入SM_MOUSEPRESENT,就会确定系统中是否安装了鼠标。
Windows可以支持三键的鼠标,三键鼠标包含左键、中键及右键,消息及鼠标的常量命名中依次用L、M及R标识三个键。单键鼠标的按键被认为是左键。尽管Windows支持多键鼠标,但大多数应用程序还是主要用左键,其他键反而极少使用。
从Windows 98及Microsoft Windows NT® 4.0开始,应用程序也可以支持鼠标滚轮了,鼠标滚轮可以被按下或者滚动。鼠标滚轮被按下时,担当中键(第三键)的作用,并发送一般的中键消息。滚轮旋转时,应用程序就会收到滚轮消息。更多信息请参照“鼠标滚轮”节。
从Windows 2000开始,应用程序可以支持应用程序命令键了,这些键被称为X键,使之能更方便地访问Internet浏览器、电子邮件及媒体服务。当X键按下时,应用程序会收到一个WM_APPCOMMAND消息。更多信息,请参照WM_APPCOMMAND消息的详细说明。
应用程序通过向GetSystemMetrics传递SM_CMOUSEBUTTONS可以确定鼠标的按键个数。要为用户设置左手习惯,可以通过SwapMouseButton函数交换意义上的左右键。通过传递SPI_SETMOUSEBUTTONSWAP给SystemParametersInfo函数也可以调换左右键。注意:鼠标是一个共享资源,调换左右键同样会影响其他的应用程序。
XBUTTONs
从Windows 2000开始, Microsoft可以支持Microsoft IntelliMouse® Explorer,就是一个具有五个键的鼠标。除了通常的左键、中间及右键外,还包括XBUTTON1及XBUTTON2两个键,这两个键在使用Microsoft Internet Explorer时可以提供浏览器的前进、后退功能。
Windows管理器通过WM_XBUTTON*及WM_NCXBUTTON*消息可以支持XBUTTON1、XBUTTON2键,这些消息中WPARAM消息中的高字(HIWORD)包含的一个标志说明按下了那个X键。由于这些鼠标消息也介于WM_MOUSEFIRST与WM_MOUSELAST之间,所以应用程序可以通过GetMessage或者PeekMessage筛选所有的鼠标消息。
Windows 2000/XP: 下面是支持XBUTTON1、XBUTTON2的消息:
- WM_APPCOMMAND
- WM_NCXBUTTONDBLCLK
- WM_NCXBUTTONDOWN
- WM_NCXBUTTONUP
- WM_XBUTTONDBLCLK
- WM_XBUTTONDOWN
- WM_XBUTTONUP
- MOUSEHOOKSTRUCTEX
下列API已更新,并可以支持新的鼠标键了: