接收和处理鼠标输入是每个 Windows 应用程序的重要组成部分。 可以处理鼠标事件以在应用程序中执行操作,或使用鼠标位置信息执行命中测试或其他操作。 此外,还可以更改应用程序中的控件处理鼠标输入的方式。 本文详细介绍了这些鼠标事件,以及如何获取和更改鼠标的系统设置。
在 Windows 窗体中,用户输入以 Windows 消息的形式发送到应用程序。 一系列可重写的方法在应用程序、窗体和控件级别处理这些消息。 当这些方法接收鼠标消息时,它们会引发可以处理的事件以获取有关鼠标输入的信息。 在许多情况下,Windows 窗体应用程序只需处理这些事件即可处理所有用户输入。 在其他情况下,应用程序可以重写其中一个方法来处理消息,以在特定消息被应用程序、窗体或控件接收之前截获它。
鼠标事件
所有 Windows 窗体控件都继承一组与鼠标和键盘输入相关的事件。 例如,控件可以处理 MouseClick 事件,以确定鼠标单击的位置。 有关鼠标事件的详细信息,请参阅使用鼠标事件。
鼠标位置和命中测试
当用户移动鼠标时,操作系统将移动鼠标指针。 鼠标指针有一个称为热点的单个像素,操作系统通过跟踪这个像素来识别指针的位置。 当用户移动鼠标或按下鼠标按钮时,Control 中包含的 HotSpot 将引发相应的鼠标事件。
可以在处理鼠标事件时,通过 Location 的 MouseEventArgs 属性或者通过 Position 类的 Cursor 属性来获取当前鼠标位置。 然后,可以使用鼠标位置信息执行命中测试,然后根据鼠标的位置执行操作。 命中测试功能内置于 Windows 窗体中的多个控件,例如 ListView、TreeView、MonthCalendar以及 DataGridView 控件。
命中测试在与相应的鼠标事件(例如MouseHover)一起使用时,对确定应用程序何时应执行特定操作非常有用。
更改鼠标输入设置
可以通过从控件派生和使用 GetStyle 和 SetStyle 方法来检测和更改控件处理鼠标输入的方式。 SetStyle 方法采用按位组合的 ControlStyles 值来确定控件是否具有标准的单击或双击行为,还是控件自行处理鼠标操作。 此外,SystemInformation 类包括描述鼠标功能的属性,并指定鼠标与操作系统的交互方式。 下表汇总了这些属性。
资产 | DESCRIPTION |
---|---|
DoubleClickSize | 获取如下区域的尺寸(以像素为单位):用户必须在此区域内单击两次,操作系统才将这两次单击视为一次双击。 |
DoubleClickTime | 获取要将鼠标操作视为双击的第一次单击与第二次单击之间可以经过的最大毫秒数。 |
MouseButtons | 获取鼠标上的按钮数。 |
MouseButtonsSwapped | 获取一个值,该值指示是否交换了鼠标左键和右键的功能。 |
MouseHoverSize | 获取特定矩形的尺寸(以像素为单位),鼠标指针必须在该矩形范围内停留达到鼠标悬停时间后,才会生成鼠标悬停消息。 |
MouseHoverTime | 获取一个以毫秒为单位的时间,鼠标指针必须在悬停矩形中停留该时间后,才会生成鼠标悬停消息。 |
MousePresent | 获取一个值,该值指示是否安装了鼠标。 |
MouseSpeed | 获取一个值,该值指示当前鼠标速度,从 1 到 20。 |
MouseWheelPresent | 获取一个值,该值指示是否安装了带有鼠标滚轮的鼠标。 |
MouseWheelScrollDelta | 获取单次鼠标轮旋转增量的增量值。 |
MouseWheelScrollLines | 获取滚动鼠标轮时所滚动过的行数。 |
处理用户输入消息的方法
窗体和控件可以访问 IMessageFilter 接口和一组可重写的方法,这些方法可在消息队列中的不同位置处理 Windows 消息。 这些方法都有一个 Message 参数,该参数封装了 Windows 消息的低级别详细信息。 你可以实现或重写这些方法来检查消息,然后处理消息或将其传递给消息队列中的下一个使用者。 下表列出了用于处理 Windows 窗体中所有 Windows 消息的方法。
方法 | 注释 |
---|---|
PreFilterMessage | 此方法在应用程序级别截获排队的(也称为已发布的)Windows 消息。 |
PreProcessMessage | 此方法在 Windows 消息被处理之前,会在窗体和控件级别拦截它们。 |
WndProc | 此方法在窗体和控件级别处理 Windows 消息。 |
DefWndProc | 此方法在窗体和控件级别执行 Windows 消息的默认处理。 这提供了窗口的最小功能。 |
OnNotifyMessage | 此方法在消息经过处理之后,在窗体和控件级别截获这些消息。 必须设置 EnableNotifyMessage 样式位才能调用此方法。 |