黄冈师范学院学报 第26卷 Journal of Huanggang Normal University VB6.0键盘触发事件探讨 汪学良 (黄冈师范学院计算机科学与技术学院,湖北黄冈438000) 摘要:简略介绍了在VB6.0中如何应用键盘事件及调用API(Application program interface应用程序接 口)函数进行键盘输入编程技术,并给出了相应的实例。 关键宇:VB;键盘输入;键盘事件 VB6.0程序设计中主要是通过响应键盘事件来处理用户输入的,VB系统为对象主要提供了三种 键盘事件:KeyPress、KeyUp和KeyDown事件。这些事件不仅提供了响应键盘的操作方法,而且还提供 了进行数据输入的手段以及在窗户和菜单中移动的基本形式。VB系统为对象主要提供了三种键盘事 件是: KeyPress事件 当用户按下ASCII字符键时触发。 KeyDown事件 当用户按下键盘的任意键盘时触发。 KeyUp事件 当用户释放键盘的任意键时触发。 1键盘事件使用详解 1.1 KeyPress事件:在按下ASCII字符相应的按键时触发KeyPress事件。ASCII字符集不仅代表标 准键盘字母、数字和标点符号,而且也代表大多数控制键。但KeyPress事件只识别Enter、Tab和 BackSpace键。在编程过程中,无论何时要处理ASCII字符都应使用KeyPress事件。 Keypress事件用法如下: Private Sub Form KeyPress(KeyAscii As Integer) KeyAscii参数返回中的ASCII代码的整型数值。KeyAscii参数的返回值是经过处理的,小键盘上 的数字键与打字键盘上的数字键盘相同的ASCII码值,表示相同的字符;而对于相同字母的大写状态 和小写状态,KeyAscii参数则返回不同的ASCII码值,表示相同的字符;而对于相同字母的大写状态和 小写状态,KeyAscii参数则返回不同的ASCII码值,能区分字母的大小写。 在窗体的KeyPress事件中编写如下码,可以测试KeyPress事件识别的键: Private Sub Form KeyPress(KeyAscii As Integer) Print“你按了”8 hr(KeyAscii)8 键,键码” ̄KeyAscii End Sub 程序中可以通过修改KeyAscii参数的返回值,使参数通过引用传递改变用户的输人。如大小定转 换、密码转换等。 1.2 KeyDown和KeyUp事件 KeyDown事件和KeyUp事件提供了最低级和最底级的键响应,这对用户来说是最基本和最直接 的。KeyDown事件是在用户按下键时触发,KeyUp事件是释放键时触发,但不一定一一对应,当用户按 住按键时,连续触发KeyDown事件,当用户释放该按键时,只触发一次KeyDown事件和KeyUp事件 可以检测到KeyPress事件不能检测到的下列情况: 收稿日期:2006—05—22. 作者简介:汪学良(1973--),男,湖北黄冈人,硕士,黄冈师范学院计算机与科学技术学院教师。 维普资讯 http://www.cqvip.com
(1)响应Shift、Ctrl和Alt键的按键动作,以及三个键的特殊组合; (2)箭头方向键。某些控件,如命令按钮、选择按钮和复选框,不响应方向事件,按下方向键只会将 焦点移动到下一个控件; (3)Esc,Ctrl,Numlock,Page Up和Page Down等功能键; (4)区分小键盘的数字键与打字键盘的数字键; (5)不仅响应按键盘操作而且响应释放键操作(KeyPress只响应按键操作); (6)与菜单无关功能键(F1 ̄F12)。 KeyDown和KeyUp事件返回用户按键的键盘码、特殊键的状态等参数,其用法为: Private Sub Form KeyDown(KeyCode As Integer.Shift As Integer) KeyCode参数批示按下的物理键,返回用户所按按键准确位置的键盘码,而不是用户输人的内容, 键盘上每一个按键分别对应不同的键盘码。 KeyCode参数是通过键盘码或键代码常数来识别键。VB系统提供了键代码常数与对应的ASCII 码值的完整列表,用户可以通过VB系统中的对象游览器来查询。在VB系统的集成环境中按F2键,或 点击相应的菜单项打开对象游览器,搜索KeyCodeConstants类获得KeyCodeConstants详细列表。 例如,字母“b”键码为( ̄1142),键代码常数是vbKeyB。判断用户按下的是否是“B”键,可以用下面 的程序来判断: Private Sub Form KeyDown(KeyCode As Integer.Shift As Integer) If KeyCode—vbKeyB Then Printf“你按了B键盘、键盘码为’' ̄KeyCode Printf“此处编写事件处理程序” End If End Sub Shift参数是用来在键盘事件发生时记录Shift、Ctrl和Alt键状态的一个整数,它使用3位二进制 表示S ̄ift、Ctrl和Alt键的操作状态: 1.3键盘技术应用技术 KeyPress事件、KeyDown事件和KeyUp事件触发的条件和时间各不相同,KeyDown事件在按下 键时触发。即按下一个键首先触发KeyDown事件,然后触发KeyPress事件,最后触发KeyUp事件。 如果在TextBox控件三个键盘事件的处理程序中,使用了MsgBox,SetFocus方法会截断后面的 键盘事件,如果用Enter键来响应MsgBox,MsgBox只处理KeyPress和KeyDown事件和KeyDown 事件,而KeyUp事件消息将会触发TextBox控件。下面的程序可以验证: Private Sub Text1 KeyDown(KeyCod ̄As Integer Shift As Inter) Print“KeyDown事件发生” MsgBox(“KeyDown事件发生”) End Sub Private Sub Text1 Keypress(KeyAscii As Integer) Print“KeyDown事件发生” MsgBox(“KeyPress事件发生”) End SUb 维普资讯 http://www.cqvip.com
Private Sub Texti KeyUp(KeyCode As Integer.Shift As Integer) Print“KeyUp事件发生” Msgbox(“KeyUp事件发生”) End sub 虽然KeyDown和KeyUp事件比KeyPress事件接收的键值要多,但KeyPress事件可以使输入的 键无效,而编写的键盘事件处理程序中,完成所有处理操作后,把KeyAseii或Keycode设置为0。 1.4示例程序 (1)小写转换 如果程序中整个窗体都需要强制用户输入大写字母,可在窗体的KeyPress事件加入如下程序: Private Sub Form KeyPress(KeyAscii As Integer) If KeyAscii>=Asc(“a”)And KeyAscii<一Asc(“z”)Then’判断输入是否为小字 KeyAscii—Asc(Ucase(Chr(KeyAscii)))’母。 End If End Sub 该程序只将输入的小写字母转换成大写字母,不影响其它输入。 (2)密文输入 如果程序中要求输入的字符和屏幕显示的字符不一至,即只有输入者才知道的密文,就要在Key— Press(KeyAscii As Integer) PassText—PassText Chr(KeyAscii) KeyAscii=KeyAscii End Sub 上面的代码使用户输入的字符和Text1控件中显示的字符在字符表中移了一位,即输入“A”,显示 为“B”。当然,一个完整的密文输入程序不是几句就解决。 (3)数据合法性试验 下面的程序对键盘输入进行数据合法性的效验,输入完毕后按Enter键,输入焦点自动跳到下一个 输入框等待用户。 Private Sub Texti KeyDown(keyCode Inter.Shteger.Shift As Integer) If KeyCode=1 3 Or KeyCode=vbKeydown Or KeyCode=vbKeyUp Then If Val(Text1)>一10 Then MsgBox“Text1必须小于107” Text lI SetFocus Text1.SelStart=0 Texti.SelLength=Len(Text1) Exit Sub E:lse If KeyCode=vbKeyUp Then SendKeys“(tab、” Else SendKeys“+{tab}’’ End if End if End if End Sub 上述程序稍加改进就可以输入固定格式小数的功能,这在数值计算程序中非常有用。 2调用API函素处理键盘输入 在VB程序中,如果在窗体或控件响应键盘事件之前处理键盘输入实现对键盘输入的全面控制,这 维普资讯 http://www.cqvip.com
・lOO・ 就是调要Windows和API函数来实现。下面的程序截获Alt+C组合键操作,并将操作转移到Corn— mandi按钮Click事件处理程序中。程序的详细代码如下: 在模块的通用声明部分添加如下声明语句: Public Declare Function CallNextHooEx Lib“user32”(ByValhHook As Long,Byval nCode As Long Byval wParam as long.Byval Iparam as long)As long public Declare Function Unhook Windows HookEX lib”user32”(Byval hHook As Long)As Long. Public Declare Function Set WindowsHookEX Lib“user32”Alias“Set Windows HookEXA”(Byval idHook As Long.ByVAL Ipfn As Long.Byval hmod As long public Declare Function PostMessage Lib“user32”Alias“post MessageA”(Byval hwnd As Long,Byval wMsg As Long,Byval wParam As long,ByvallParam As long)As Long Global hHook As Long 在模块中建之Keybp函数,该函数在VB窗体和控件响应键盘事件之前处理键盘输人: Public Function Keybp(ByVal nCode As Long.ByVal wParam As Long BuyVal1 Param As Long)As Long If nCode>=O Then’处理要过滤的键 If(Iparam And&HCO00000)一0 Then Form1.Command1.SetFocus Call PostMessage(Form1.Command1.hwnd.&H201.O&h2OO2) Call PostMessage(Form1.Command 1.hwnd.&h2O2.0.&H2002) Keybp=l Exit Function End If End If End If KeybP=CallNextHookEx.hHook.nCode.wParam.Iparam) End Function 在窗体Forml的Load事件中将KeybP函数连到中断上 Private Sub Form Load() hHook=SetWindowsHookEx(2.Address Of KeybP.0&App.ThreadID) End Sub 在窗体Forml的UnLoad事件中将keybP函数脱离中断 Private Sub Form Unload(Cancel As Integer) Call UnhookWindowsHookEx(hHook) End Sub 在窗体Forml的Command1按钮中添加消息提示 Private Sub Command l Click() MsgBox(“你按了Alt+C键!”) Ehd Sub 3结束语 VB系统中有许多可接受键盘输入触发键盘事件的控件,本文不一一列举。有的控件键盘事件可能 略有不同,按照本文中给出的程序做一些简单实验就可以测试出来。 责任编辑周觅
因篇幅问题不能全部显示,请点此查看更多更全内容