Windows 窗体中鼠标输入的工作原理

接收和处理鼠标输入是每个 Windows 应用程序的重要组成部分。 你可以处理鼠标事件以在应用程序中执行操作,或使用鼠标位置信息执行命中测试或其他操作。 此外,你还可更改应用程序中的控件处理鼠标输入的方式。 本主题将详细介绍这些鼠标事件,以及如何获取和更改鼠标的系统设置。 有关随鼠标事件提供的数据以及引发鼠标单击事件的顺序的详细信息,请参阅 Windows 窗体中的鼠标事件

鼠标位置和命中测试

当用户移动鼠标时,操作系统将移动鼠标指针。 鼠标指针包含一个称为“热点”的像素,操作系统会跟踪该像素并将其识别为指针的位置。 当用户移动鼠标或按下鼠标按钮时,包含 HotSpotControl 将引发相应的鼠标事件。 可以在处理鼠标事件时使用 MouseEventArgsLocation 属性获取当前鼠标位置,也可使用 Cursor 类的 Position 属性获取当前鼠标位置。 后续可使用鼠标位置信息来执行命中测试,然后根据鼠标的位置执行操作。 命中测试功能内置于 Windows 窗体中的若干控件,如 ListViewTreeViewMonthCalendarDataGridView 控件。 与相应的鼠标事件(例如 MouseHover)一起使用时,命中测试在确定应用程序应何时执行特定操作时非常有用。

鼠标事件

响应鼠标输入的主要方法是处理鼠标事件。 下表显示了鼠标事件并说明了这些事件的引发时间。

鼠标事件 说明
Click 此事件在释放鼠标按钮时发生,通常在 MouseUp 事件之前。 此事件的处理程序接收类型为 EventArgs 的参数。 如果只需确定何时发生单击,处理此事件。
MouseClick 此事件在用户使用鼠标单击控件时发生。 此事件的处理程序接收类型为 MouseEventArgs 的参数。 如果需要在发生单击时获取有关鼠标的信息,处理此事件。
DoubleClick 此事件在双击控件时发生。 此事件的处理程序接收类型为 EventArgs 的参数。 如果只需确定何时发生双击,处理此事件。
MouseDoubleClick 此事件在用户使用鼠标双击控件时发生。 此事件的处理程序接收类型为 MouseEventArgs 的参数。 如果需要在发生双击时获取有关鼠标的信息,处理此事件。
MouseDown 当鼠标指针位于控件上方并且用户按下鼠标按钮时,会发生此事件。 此事件的处理程序接收类型为 MouseEventArgs 的参数。
MouseEnter 当鼠标指针进入控件的边框或工作区时(具体取决于控件的类型),会发生此事件。 此事件的处理程序接收类型为 EventArgs 的参数。
MouseHover 此事件在鼠标指针停留在控件上时发生。 此事件的处理程序接收类型为 EventArgs 的参数。
MouseLeave 当鼠标指针离开控件的边框或工作区时(具体取决于控件的类型),会发生此事件。 此事件的处理程序接收类型为 EventArgs 的参数。
MouseMove 当鼠标指针发生移动但仍位于控件上方时,会发生此事件。 此事件的处理程序接收类型为 MouseEventArgs 的参数。
MouseUp 当鼠标指针位于控件上方,并且用户释放鼠标按钮时,会发生此事件。 此事件的处理程序接收类型为 MouseEventArgs 的参数。
MouseWheel 当用户滚动鼠标滚轮并且控件有焦点时,会发生此事件。 此事件的处理程序接收类型为 MouseEventArgs 的参数。 可以使用 MouseEventArgsDelta 属性来确定鼠标滚动的距离。

更改鼠标输入和检测系统设置

可通过从控件派生并使用 GetStyleSetStyle 方法,检测并更改控件处理鼠标输入的方式。 SetStyle 方法使用 ControlStyles 值的按位组合来确定控件是否将具有标准单击或双击行为,或控件是否将处理自己的鼠标处理。 此外,SystemInformation 类还包括描述鼠标功能以及指定鼠标与操作系统交互方式的属性。 下表对这些属性进行了总结。

properties 说明
DoubleClickSize 获取如下区域的尺寸(以像素为单位):用户必须在此区域内单击两次,操作系统才将这两次单击视为一次双击。
DoubleClickTime 获取要使操作系统将鼠标操作视为双击,第一次单击与第二次单击之间可以经过的最大毫秒数。
MouseButtons 获取鼠标上的按钮数。
MouseButtonsSwapped 获取一个值,该值指示是否已交换鼠标左右按钮的功能。
MouseHoverSize 获取特定矩形的尺寸(以像素为单位),鼠标指针必须在该矩形范围内停留达到鼠标悬停时间后,才会生成鼠标悬停消息。
MouseHoverTime 获取一个以毫秒为单位的时间,鼠标指针必须在悬停矩形中停留该时间后,才会生成鼠标悬停消息。
MousePresent 获取一个值,该值指示鼠标是否已安装。
MouseSpeed 获取一个值,该值指示当前鼠标速度,范围为 1 至 20。
MouseWheelPresent 获取一个值,该值指示是否安装了带有鼠标轮的鼠标。
MouseWheelScrollDelta 获取单次鼠标轮旋转增量的增量值。
MouseWheelScrollLines 获取滚动鼠标轮时所滚动过的行数。

另请参阅