思路:先用 "GetKeyState" 判断开关键的状态,并转换为布尔值,如果打开,则位0为1,此时布尔值为True,然后判断该布尔值与设定布尔值是否相同,如果不同,使用 "MapVirtualKey" 返回开关键码对应的扫描码,最后用到两次 "keybd_event" ,第一次模拟开关键按下,第二次模拟开关键放开。
'以下代码在模块:
Option Explicit
![VB - 设定开关键[CapsLock - ScrollLock - NumLock] win10开机numlock不亮](http://img.413yy.cn/images/31101031/31035922t0100e9f3f4c6b72148.jpg)
Public Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As Integer
Public Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" (ByVal wCode As Long, _
ByVal wMapType As Long) As Long
Public Declare Sub keybd_event Lib "user32" (ByVal bVk As Byte, _
ByVal bScan As Byte, _
ByVal dwFlags As Long, _
ByVal dwExtraInfo As Long)
Public Const KEYEVENTF_EXTENDEDKEY = &H1
Public Const KEYEVENTF_KEYUP = &H2
Public Sub SetNumLock(ByVal bLock As Boolean)
Dim Check As Boolean, ScanCode As Long
Check = CBool(GetKeyState(vbKeyNumlock))
If Check <> bLock Then
ScanCode = MapVirtualKey(vbKeyNumlock, 0)
Call keybd_event(vbKeyNumlock, ScanCode, 0, 0)
Call keybd_event(vbKeyNumlock, ScanCode, KEYEVENTF_KEYUP, 0)
End If
End Sub
Public Sub SetScrollLock(ByVal bLock As Boolean)
Dim Check As Boolean, ScanCode As Long
Check = CBool(GetKeyState(vbKeyScrollLock))
If Check <> bLock Then
ScanCode = MapVirtualKey(vbKeyScrollLock, 0)
Call keybd_event(vbKeyScrollLock, ScanCode, 0, 0)
Call keybd_event(vbKeyScrollLock, ScanCode, KEYEVENTF_KEYUP, 0)
End If
End Sub
Public Sub SetCapsLock(ByVal bLock As Boolean)
Dim Check As Boolean, ScanCode As Long
Check = CBool(GetKeyState(vbKeyCapital))
If Check <> bLock Then
ScanCode = MapVirtualKey(vbKeyCapital, 0)
Call keybd_event(vbKeyCapital, ScanCode, 0, 0)
Call keybd_event(vbKeyCapital, ScanCode, KEYEVENTF_KEYUP, 0)
End If
End Sub
'调用示例(这里只例举设定NumLock键,其他两个键调用方法相同):
Call SetNumLock(False) '关闭NumLock键
Call SetNumLock(True) '打开NumLock键