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

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

鼠标位置和命中测试

当用户移动鼠标时,操作系统将移动鼠标指针。 鼠标指针包含一个称为热点的像素,操作系统会跟踪这个热点并识别为指针的位置。 当用户移动鼠标或按下鼠标按钮时,Control 中包含的 HotSpot 将引发相应的鼠标事件。 可以在处理鼠标事件时,通过 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 类包括描述鼠标功能的属性,并指定鼠标与操作系统的交互方式。 下表汇总了这些属性。

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

另请参阅