在Windows编程中,用户输入(包括鼠标输入和键盘输入)是非常重要的一个话题。本节介绍如何处理用户输入、输入验证、Windows程序中鼠标的托放功能、如何模拟用户输入等。
一、用户输入
在Windows 窗体中,用户输入以Windows 消息的形式发送到应用程序。
一系列可重写的方法在应用程序、窗体和控件级处理这些消息。当这些方法接收到鼠标和键盘消息时,将引发相应的事件,可以处理这些事件来获取关于鼠标或键盘输入的信息。
在许多情况下,Windows 窗体应用程序可以仅仅通过处理这些事件来处理所有用户输入。
所有Windows 窗体控件都继承一组与鼠标和键盘输入有关的事件。
二、键盘输入
Windows 窗体通过引发键盘事件来处理键盘输入以响应Windows 消息。
键盘事件:当用户按键盘键时,Windows 窗体提供两个事件,而当用户松开键盘键时,Windows 窗体提供一个事件。
KeyDown事件发生一次;KeyPress事件,当用户按住同一个键时,该事件可以发生多次。当用户松开键时,KeyUp事件发生一次。
键盘事件

KeyPressEventArgs.KeyChar获取或设置与按下的键对应的字符。
可以获取或设置以下键:a-z、A-Z、Ctrl、标点符号、键盘顶部和数字键盘上的数字键、Enter。
不能获取或设置以下键:Tab 键、Insert 和Delete、Home、End、Page Up 、Page Down、F1-F12、Alt、箭头键。
Keys 枚举指定键代码和修饰符。
例如:Keys.D0:表示0 键;Keys.NumPad0:表示数字键盘上的0 键;Keys.Add:加号键;Control:Ctrl修改键; Delete:DeL键;Enter:Enter键。
在窗体级别处理键盘输入
Windows 窗体提供在键盘消息到达控件前在窗体级别处理这些消息的功能。
处理启动窗体的KeyPress或KeyDown事件,将窗体的KeyPreview属性设置为true,使键盘消息在到达窗体上的任何控件之前先被窗体接收。
确定所按下的修改键
在创建接受用户击键的应用程序时,您可能还希望监视修改键,如Shift、Alt 和Ctrl 键。并希望在同时按下修改键和其他键,或者单击鼠标的同时按下修改键时,您的应用程序可以做出适当的响应。
如果处理KeyDown事件,则事件处理程序所接收的KeyEventArgs的Modifiers 属性指定按下。
如果处理KeyPress事件或鼠标事件,必须使用Control 类的ModifierKeys属性。
Control.ModifierKeys:获取一个值,该值指示哪一个修改键(Shift、Ctrl 和Alt)处于按下的状态。
DEMO1:键盘输入示例
三、数据验证
若要验证控件的内容,可以编写代码来处理Validating 事件。
属性CausesValidation
如果测试失败,请将Validating 事件的CancelEventArgs的Cancel 属性设置为true。这将取消Validating 事件,并导致焦点返回到控件。
当数据无效时,维护焦点的控件的副作用是,使用关闭窗体的任何常规方法都将无法关闭父窗体。必须重写窗体的Closing 事件。
DEMO2:控件验证示例
四、鼠标输入
接收和处理鼠标输入是每个Windows 应用程序的重要组成部分。
处理鼠标输入时,经常需要知道鼠标指针的位置和鼠标按钮的状态。
MouseEventArgs提供有关鼠标当前状态的信息,包括鼠标指针在工作区坐标中的位置、按下了哪个鼠标按钮以及是否滚动了鼠标轮。
也可以使用Control 类的MouseButtons和MousePosition属性。
MouseButtons返回当前按下的鼠标按钮的有关信息。
MousePosition返回鼠标指针的屏幕坐标,该值等于Position 返回的值。
DEMO3:线条和矩形的绘制
五、Windows 窗体中的拖放功能
Windows 窗体包含一组用于实现拖放行为的方法、事件和类。
使用Control 类的DoDragDrop方法可以完成托放操作。
DragEventArgs类提供鼠标指针的位置、鼠标按钮和键盘修改键的当前状态、正在拖动的数据和DragDropEffects值
在拖放操作中有两类事件:一类是在拖放操作的当前目标上发生的事件;一类是在拖放操作的源上发生的事件。
当前目标上的事件

源上的事件
QueryContinueDragEventArgs类提供鼠标按钮和键盘修改键的当前状态、指定是否按下了Esc 键的值和DragAction值(设置该值可指定是否应继续拖放操作)。

如何实现拖放操作
拖动数据:所有拖放操作都从拖动开始。实现在拖动开始时收集数据的功能在DoDragDrop方法中实现。
放置数据:可以通过设置AllowDrop属性并处理DragEnter和DragDrop事件,使Windows 窗体或控件内的任何区域接受放置的数据。
DEMO4:数据托放
六、如何模拟输入
模拟鼠标事件:非常好的方法是调用引发要模拟的鼠标事件的OnEventName方法。此选项通常只在自定义控件和窗体中是可能的,因为引发事件的方法受保护,而且不能从控件或窗体外部访问。
模拟键盘输入:Windows 窗体提供了用于将键击发送到活动应用程序的SendKeys类。
DEMO5:模拟及计算器键盘输入
七、简易画图程序
DEMO6:简易画图程序