vba 如何获取键盘消息
1个回答
展开全部
获取键盘信息
29.4.2 获取键盘信息
在VBA中,没有提供获取键盘状态的函数。在程序中若需要查询键盘状态,可编写代码调用API函数节器完成。
1.GetKeyState函数
使用该函数可获取键盘锁定键的状态,函数原型如下:
Public Declare Function GetKeyState Lib
"user32" (ByVal nVirtKey As Long) As Integer
参数nVirtKey为需要获取状态的键常数,在VBA中,每个键都有一个对应的常数,例如,CapsLock键的常数为vbKeyCapital。
该函数返回值为一个整型值,如果最低位为1,则表示锁定键是打开的,因此可以使用以下代码来判断:
CBool(GetKeyState(vbKeyCapital) And 1)
将GetKeyState函数的返回值与整数1进行逻辑与运算,来取得返回值的最低位,然后通过CBool函数将其转换为逻辑值,即可得到指定锁定键的状态。
2.GetKeyboardState函数和SetKeyboardState函数
设置锁定键状态需使用GetKeyboardState和SetKeyboardState函数来操作。这两个函数都用一个256字节缓冲区取得或设置256个键设置,在VBA中设置一个有256个元素的字节数组来作为缓冲区,这个数组记录着键盘状态,每个键在数组中的位置由VK_常数决定。
一旦用GetKeyboardState函数取得键盘各键状态并存储到缓冲区中后,即可修改特定的键设置,然后用SetKeyboardState函数存回设置,达到修改键设置的目的。
GetKeyboardState函数可取得键盘上每个虚拟键当前的状态,其函数原型如下:
Declare Function GetKeyboardState
Lib "user32" Alias "GetKeyboardState" _
(pbKeyState As Byte) As Long
参数pbKeyState为具有256个元素的字节数组的第一个项目。
如果函数返回非0表示成功,返回0则表示失败。
SetKeyboardState函数用来设置每个虚拟键当前在键盘上的状态,其声明格式如下:
Declare Function SetKeyboardState Lib
"user32" Alias "SetKeyboardState" _
(lppbKeyState As Byte) As Long
了解设置键盘状态的函数后,就可以在VBA中编写代码,用来设置锁定键的状态。具体步骤如下:
(1)在Excel中按快捷键Alt+F11进入VBE。
(2)单击菜单【插入】|【模块】命令,向工程中插入一个模块体。
(3)在模块的声明部分粘贴API函数的定义如下:
Public Declare Function GetKeyState Lib
"user32" (ByVal nVirtKey As Long) As Integer
Public Declare Function GetKeyboardState
Lib "user32" (pbKeyState As Byte) As Long
Public Declare Function SetKeyboardState
Lib "user32" (lppbKeyState As Byte) As Long
(4)编写修改锁定键状态的通用子过程,具体代码如下:
Sub SetKeyState(intVKey As Integer, bState As Boolean) '修改键盘状态
Dim aBuffer(0 To 255) As Byte '定义数组作为缓冲区
GetKeyboardState aBuffer(0) '获取键盘状态放入缓冲区
aBuffer(intVKey) = CByte(Abs(bState)) '在缓冲区修改指定键的状态
SetKeyboardState aBuffer(0) '使用缓冲区修改键的状态
End Sub
程序中使用数组的第一个元素作为参数传递给两个API函数,由于数组在VBA中是连续存放的,所以API函数通过第一个元素的地址就可访问到后面的所有元素。
(5)有了通用函数SetKeyState,就可以很方便地编写修改锁定键状态的代码了。例如,以下代码可修改CapsLock键的状态(在大小写之间相互切换):
Sub ModiCapsLock() '大写锁定
If CBool(GetKeyState(vbKeyCapital) And 1)
Then '获取CapsLock原来的状态
SetKeyState vbKeyCapital, False '关闭
Else
SetKeyState vbKeyCapital, True '打开
End If
End Sub
程序首先使用GetKeyState函数查询CapsLock原来的状态,再将其状态进行切换(即如果原来是打开的,就将其关闭;如果原来是关闭的,就将其打开)。
29.4.2 获取键盘信息
在VBA中,没有提供获取键盘状态的函数。在程序中若需要查询键盘状态,可编写代码调用API函数节器完成。
1.GetKeyState函数
使用该函数可获取键盘锁定键的状态,函数原型如下:
Public Declare Function GetKeyState Lib
"user32" (ByVal nVirtKey As Long) As Integer
参数nVirtKey为需要获取状态的键常数,在VBA中,每个键都有一个对应的常数,例如,CapsLock键的常数为vbKeyCapital。
该函数返回值为一个整型值,如果最低位为1,则表示锁定键是打开的,因此可以使用以下代码来判断:
CBool(GetKeyState(vbKeyCapital) And 1)
将GetKeyState函数的返回值与整数1进行逻辑与运算,来取得返回值的最低位,然后通过CBool函数将其转换为逻辑值,即可得到指定锁定键的状态。
2.GetKeyboardState函数和SetKeyboardState函数
设置锁定键状态需使用GetKeyboardState和SetKeyboardState函数来操作。这两个函数都用一个256字节缓冲区取得或设置256个键设置,在VBA中设置一个有256个元素的字节数组来作为缓冲区,这个数组记录着键盘状态,每个键在数组中的位置由VK_常数决定。
一旦用GetKeyboardState函数取得键盘各键状态并存储到缓冲区中后,即可修改特定的键设置,然后用SetKeyboardState函数存回设置,达到修改键设置的目的。
GetKeyboardState函数可取得键盘上每个虚拟键当前的状态,其函数原型如下:
Declare Function GetKeyboardState
Lib "user32" Alias "GetKeyboardState" _
(pbKeyState As Byte) As Long
参数pbKeyState为具有256个元素的字节数组的第一个项目。
如果函数返回非0表示成功,返回0则表示失败。
SetKeyboardState函数用来设置每个虚拟键当前在键盘上的状态,其声明格式如下:
Declare Function SetKeyboardState Lib
"user32" Alias "SetKeyboardState" _
(lppbKeyState As Byte) As Long
了解设置键盘状态的函数后,就可以在VBA中编写代码,用来设置锁定键的状态。具体步骤如下:
(1)在Excel中按快捷键Alt+F11进入VBE。
(2)单击菜单【插入】|【模块】命令,向工程中插入一个模块体。
(3)在模块的声明部分粘贴API函数的定义如下:
Public Declare Function GetKeyState Lib
"user32" (ByVal nVirtKey As Long) As Integer
Public Declare Function GetKeyboardState
Lib "user32" (pbKeyState As Byte) As Long
Public Declare Function SetKeyboardState
Lib "user32" (lppbKeyState As Byte) As Long
(4)编写修改锁定键状态的通用子过程,具体代码如下:
Sub SetKeyState(intVKey As Integer, bState As Boolean) '修改键盘状态
Dim aBuffer(0 To 255) As Byte '定义数组作为缓冲区
GetKeyboardState aBuffer(0) '获取键盘状态放入缓冲区
aBuffer(intVKey) = CByte(Abs(bState)) '在缓冲区修改指定键的状态
SetKeyboardState aBuffer(0) '使用缓冲区修改键的状态
End Sub
程序中使用数组的第一个元素作为参数传递给两个API函数,由于数组在VBA中是连续存放的,所以API函数通过第一个元素的地址就可访问到后面的所有元素。
(5)有了通用函数SetKeyState,就可以很方便地编写修改锁定键状态的代码了。例如,以下代码可修改CapsLock键的状态(在大小写之间相互切换):
Sub ModiCapsLock() '大写锁定
If CBool(GetKeyState(vbKeyCapital) And 1)
Then '获取CapsLock原来的状态
SetKeyState vbKeyCapital, False '关闭
Else
SetKeyState vbKeyCapital, True '打开
End If
End Sub
程序首先使用GetKeyState函数查询CapsLock原来的状态,再将其状态进行切换(即如果原来是打开的,就将其关闭;如果原来是关闭的,就将其打开)。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |