VBA中检测键盘控制键

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

VBA中检测键盘控制键(Shift Control Alt)状态
来源:水文工具集分类:代码, 博客标签:VBA
VBA编写的程序中,经常需要提供一些功能键或者快捷键或者是辅助键,比如
Shift|Control|Alt,以方便用户更方便使用你的程序。

VBA中并没有相关函数来完成检测键盘控制键状态的函数,因此,必须使用Windows API函数GetKeyState。

GetKeyState 函数会返回某个指定按键的状态(按下或者未按下)。

水文工具集提供VBA编写的3个相关函数,可以方便你在代码中使用,用以完成相关功能。

IsShiftKeyDown:检测Shift控制键状态
IsControlKeyDown:检测Control控制键状态
IsAltKeyDown:检测Alt控制键状态
上面的函数返回True或者False,当指定按键按下时返回True,而未按下时返回False。

函数的定义如下:
Function IsShiftKeyDown( _
LeftOrRightKey As Long = LeftKeyOrRightKey _
03.) As Boolean
04.
Function IsControlKeyDown( _
LeftOrRightKey As Long = LeftKeyOrRightKey _
07.) As Boolean
08.
Function IsAltKeyDown( _
LeftOrRightKey As Long = LeftKeyOrRightKey _
11.) As Boolean
上面的函数都有一个可选的参数来指定是检测只有左边或者只有右边或者两者其一或者同时按下控制键,默认是左边右边两者其一,具体的可选参数有下面的类型:
Const BothLeftAndRightKeys = 0
2.' BOTH left and right together
Const LeftKey = 1
4.' LEFT key only
Const RightKey = 2
6.' RIGHT key only
Const LeftKeyOrRightKey = 3
8.' EITHER left or right or BOTH
当然如果加以修改,一样可以用来其它功能键。

VBA中检测键盘控制键(Shift Control Alt)状态具体源代码如下:
01.'================================
02.' VBA中检测键盘控制键(Shift Control Alt)状态
03.'
04.' m
05.'================================ Explicit
Compare Text
08.
Declare Function GetKeyState Lib"user32" ( _ nVirtKey As Long) As Integer
11.
Const KEY_MASK As Integer = &HFF80 ' decimal -128 13.
Const VK_LSHIFT = &HA0
Const VK_RSHIFT = &HA1
Const VK_LCONTROL = &HA2
Const VK_RCONTROL = &HA3
Const VK_LMENU = &HA4
Const VK_RMENU = &HA5
20.
Const VK_LALT = VK_LMENU
Const VK_RALT = VK_RMENU
Const VK_LCTRL = VK_LCONTROL
Const VK_RCTRL = VK_RCONTROL
25.
Const BothLeftAndRightKeys = 0
Const LeftKey = 1
Const RightKey = 2
Const LeftKeyOrRightKey = 3
30.
Function IsShiftKeyDown(OptionalLeftOrRightKey As Long = LeftKeyOrRightKey)As Boolean
Res As Long
33.
Case LeftOrRightKey
LeftKey
36.Res = GetKeyState(VK_LSHIFT) AndKEY_MASK
RightKey
38.Res = GetKeyState(VK_RSHIFT) AndKEY_MASK
BothLeftAndRightKeys
40.Res =
(GetKeyState(VK_LSHIFT) AndGetKeyState(VK_RSHIFT) AndKEY_MASK) Else
42.Res = GetKeyState(vbKeyShift) AndKEY_MASK
Select
44.
45.IsShiftKeyDown = CBool(Res)
Function
Function IsControlKeyDown(OptionalLeftOrRightKey As Long = LeftKeyOrRightKey)As Boolean
Res As Long
50.
Case LeftOrRightKey
LeftKey
53.Res = GetKeyState(VK_LCTRL) AndKEY_MASK
RightKey
55.Res = GetKeyState(VK_RCTRL) AndKEY_MASK
BothLeftAndRightKeys
57.Res = (GetKeyState(VK_LCTRL) AndGetKeyState(VK_RCTRL) AndKEY_MASK)
Else
59.Res = GetKeyState(vbKeyControl) AndKEY_MASK
61.
62.IsControlKeyDown = CBool(Res)
63.
Function
65.
Function IsAltKeyDown(OptionalLeftOrRightKey As Long = LeftKeyOrRightKey)As Boolean
Res As Long
68.
Case LeftOrRightKey
LeftKey
71.Res = GetKeyState(VK_LALT) AndKEY_MASK
RightKey
73.Res = GetKeyState(VK_RALT) AndKEY_MASK
BothLeftAndRightKeys
75.Res = (GetKeyState(VK_LALT) AndGetKeyState(VK_RALT) AndKEY_MASK)
Else
77.Res = GetKeyState(vbKeyMenu) AndKEY_MASK
Select
79.
80.IsAltKeyDown = CBool(Res)
81.
Function
下面代码是调用了上面函数的一个测试,我们可以从VBA编辑器的调试窗口中看到相关控制键状态。

Test()
02.Application.OnTime Now + TimeSerial(0, 0, 2), "ProcTest", , True
Sub
04.
ProcTest()
06.Debug.Print "SHIFT KEY: ", _
07."LEFT: " & CStr(IsShiftKeyDown(LeftKey)), _
08."RIGHT: " & CStr(IsShiftKeyDown(RightKey)), _
09."EITHER: " &CStr(IsShiftKeyDown(LeftKeyOrRightKey)), _
10."BOTH: " &CStr(IsShiftKeyDown(BothLeftAndRightKeys))
11.
12.Debug.Print "ALT KEY: ", _
13."LEFT: " & CStr(IsAltKeyDown(LeftKey)), _
14."RIGHT: " & CStr(IsAltKeyDown(RightKey)), _
15."EITHER: " &CStr(IsAltKeyDown(LeftKeyOrRightKey)), _
16."BOTH: " &CStr(IsAltKeyDown(BothLeftAndRightKeys))
17.
18.Debug.Print "CTRL KEY: ", _
19."LEFT: " & CStr(IsControlKeyDown(LeftKey)), _
20."RIGHT: " & CStr(IsControlKeyDown(RightKey)), _
21."EITHER: " &CStr(IsControlKeyDown(LeftKeyOrRightKey)), _
22."BOTH: " &CStr(IsControlKeyDown(BothLeftAndRightKeys))
23.
Sub
原创文章如转载,请注明:
转载自水文工具集 [ ]。

相关文档
最新文档