VB 版 (精华区)

发信人: zxfsnow (最近睡眠太少), 信区: VB
标  题: 用VB编写键盘拦截程序 
发信站: 哈工大紫丁香 (2000年06月07日18:23:12 星期三), 转信

发信人: Love1976 (狄飞惊), 信区: VisualBasic
标  题: 用VB编写键盘拦截程序
发信站: BBS 水木清华站 (Wed May 24 23:42:41 2000)

(本文转自电脑商情报)

  我们知道,在一些程序中,有一些快捷方式(如:Shift键最小化、ESC键退出
、Ctrl+S存盘、Alt+x退出等等)。以前有一些介绍使用Win32 API可以做到,但
过于繁琐,其实VB本身已经给我们提供了这个功能。
  我们来新建一个窗体Form1,对于键盘操作可以看到有三个事件KeyPress(),
KeyDown和KeyUp,下面我对它们分别介绍:
  KeyPress()事件是当用户按下和松开一个 ANSI 键时发生(ANSI是可见ASCII字
符1-127)。
  语法
  Private Sub object_KeyPress([index As Integer,]keyascii As
Integer)
  KeyPress 事件语法包含下列部分:
   部分 描述
  object 一个对象表达式,其值是“应用于”列表中的一个对象。
  index 一个整数,它用来唯一标识一个在控件数组中的控件(仅有控件数组时
才有)。
  keyascii 是返回一个标准数字 ANSI 键代码的整数。Keyascii 通过引用传递
,对它进行改变可给对象
  发送一个不同的字符。将 keyascii 改变为 0 时可取消击键,这样一来对象
便接收不到字符。
  说明
  具有焦点的对象接收该事件。一个窗体仅在KeyPreview 属性被设置为 True
时才能接收该事件。一个 KeyPress 事件可以引用任何可打印的键盘字符,一个来
自标准字母表的字符或少数几个特殊字符之一的字符与 CTRL 键的组合,以及
ENTER 或BACKSPACE键。KeyPress()事件过程在截取 TextBox 或 ComboBox 控件所
输入的击键时是非常有用的。它可立即测试击键的有效性或在字符输入时对其进行
格式处理。改变 keyascii 参数的值会改变所显示的字符。
  可使用下列表达式将 keyascii 参数转变为一个字符:
  Chr(KeyAscii)
  然后执行字符串操作,并将该字符反译成一个控件可通过该表达式解释的
ANSI 数字:
  KeyAscii = Asc(char)
  在KeyPress()处理不了的功能可以由KeyDown()和KeyUp()事件来处理:
  语法
   Private Sub object_KeyDown([index As Integer,]keycode As Integer,
shift As Integer)
  Private Sub object_KeyUp([index As Integer,]keycode As Integer,
shift As Integer)
  KeyDown 和 KeyUp 事件包括下列部分:
  部分 描述
  object 一个对象表达式,其值是“应用于”列表中的一个对象。
  index 是一个整数,它用来唯一标识一个在控件数组中的控件(仅有控件数组
时才有)。
  keycode 是一个键代码,诸如 vbKeyF1 ( F1 键)或 vbKeyHome ( HOME 键
)。
  shift 是在该事件发生时响应 SHIFT ,CTRL 和 ALT 键的状态的一个整数。
shift、CTRL、ALT 键在这些位分别对应于值 1、2 和 4。例如:如果 CTRL 和
ALT 这两个键都被按下,则 shift 的值为 6。
  说明
  对于这两个事件来说,带焦点的对象都接收所有击键。一个窗体只有在不具有
可视的和有效的控件时才可以获得焦点。虽然KeyDown()和KeyUp()事件可应用于大
多数键,它们最经常地还是应用于:扩展的字符键如功能键、定位键、键盘修饰键
和按键的组合、区别数字小键盘和常规数字键;在需要对按下和松开一个键都响应
时,可使用 KeyDown 和 KeyUp 事件过程。
  下列情况不能引用 KeyDown 和 KeyUp 事件:窗体有一个 CommandButton 控
件,并且 Default 属性设置为 True 时的 ENTER 键。窗体有一个 CommandButton
 控件,并且 Cancel 属性设置为 True 时的 ESC 键、TAB键,KeyDown 和
KeyUp 用两种参数解释每个字符的大写形式和小写形式:keycode —显示物理的键
(将 A 和 a 作为同一个键返回)和shift—显示shift+key键的状态而且返回A或
a其中之一。
  如果需要测试 shift 参数,可使用该参数中定义各位的 shift 常数。该常数
有下列值:
  常数 值 描述
  vbShiftMask 1 HIFT 键的位
   屏蔽。
  VbCtrlMask 2 CTRL 键的
   位屏蔽。
  VbAltMask 4 ALT 键的位
   屏蔽。
  该常数用作位屏蔽,它可被用来测试任何键组合。
  注意:如果 KeyPreview 属性被设置为 True,则一个窗体先于该窗体上的控
件接收到此事件。可用 KeyPreview 属性来创建全局键盘处理例程。
  了解了以上知识,我们可以制作出非常完美而且带有快捷键的程序,例如我们
在一个程序中要用Ctrl+S存盘,Shift最小化,Alt+X和ESC退出:
  首先启动vb选择新建EXE文件,在Form1窗体上拉一个TextBox,并把Form1的
KeyPreview属性设为True,双击Form1,选择Form的KeyPress事件,输入如下代码:

  Private Sub Form_KeyPress(KeyAscii as Integer) 'Esc键退出,VbEscape
可以用27代替
  If KeyAscii=VbEscape then End
  End Sub
  在Form的KeyDown事件中输入如下代码:
  Private Sub Form_KeyDown(KeyCode as Integer,Shift as Integer) '处理
Ctrl+X,Shift,Alt+X
  If Shift=2 And KeyCode=VbKeyS Then Print #FileNum,Form1.Text1.
Text 'Ctrl+S存盘,VbKeyS=83
  If shift=2 then Form1.WindowState=1 'Shift最小化
  If Shift=4 And KeyCode=VbKeyX Then End 'Alt+X退出,VbkeyX=88
  End Sub
  在Form的Load事件中输入如下代码:
  Private Sub Form_load()
  Dim FileNum as integer
  FileNum=FreeFile
  Open App.Path+“\Sample.txt" For Append As #FileNum
  End Sub
  运行它就可以实现我们所要求的功能了,举这个例子只是抛砖引玉的作用,

--
我并不是在等待奇迹,因为我知道没有奇迹的。
有的,也只是爱情、意志和勇气。
是这些东西的重叠后,而成为奇迹的。
所以,我从未曾想过放弃。
  
--

 以科计为本,以产业报国!
  超越自我,飞跃无限!
  

※ 来源:·哈工大紫丁香 bbs.hit.edu.cn·[FROM: 202.118.235.252]
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.822毫秒