Private Type KeyboardBytes kbByte(0 To 255) As Byte End Type
Declare Function GetKeyboardState Lib "user32" (pbKeyState As KeyboardBytes) As Long
Sub test() Dim kbarray As KeyboardBytes GetKeyboardState kbarray MsgBox "caps lock=" & kbarray.kbByte(20) MsgBox "num lock=" & kbarray.kbByte(144) MsgBox "scroll lock=" & kbarray.kbByte(145) End Sub
感谢2楼的答复,那再请教,怎样改变他们的状态?
我在VBA中试着用Sendkeys "{NUMLOCK}",模拟键盘输入,但是没有用,这三盏灯不会变。
我本来想根据原先这三个键的当前状态,然后用程序改变它。
现在可以获知键的状态,但怎样用程序改变它?我对API不熟,手头也没有这方面的资料,希望知道的能告知一下,非常感谢。
感谢2楼的答复,那再请教,怎样改变他们的状态?
我在VBA中试着用Sendkeys "{NUMLOCK}",模拟键盘输入,但是没有用,这三盏灯不会变。
我本来想根据原先这三个键的当前状态,然后用程序改变它。
现在可以获知键的状态,但怎样用程序改变它?我对API不熟,手头也没有这方面的资料,希望知道的能告知一下,非常感谢。
用application.sendkeys即可. 問題是僅在runtime有效. 試試....
Sub test() Dim kbarray As KeyboardBytes Application.SendKeys "{numlock}" '使numlock燈亮.顯示狀態卻為0. GetKeyboardState kbarray MsgBox "caps lock=" & kbarray.kbByte(20) MsgBox "num lock=" & kbarray.kbByte(144) MsgBox "scroll lock=" & kbarray.kbByte(145) End Sub
问题已解决,解决方案详见微软的HOWT Toggle the NUM LOCK, CAPS LOCK, and SCROLL LOCK Keys http://support.microsoft.com/?id=177674
虽然是英文,但是很简单,代码一看就懂
-- 我是新生,还要好好学习,才能天天向上
' Declare Type for API call: Private Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 ' Maintenance string for PSS usage End Type ' API declarations: Private Declare Function GetVersionEx Lib "kernel32" _ Alias "GetVersionExA" _ (lpVersionInformation As OSVERSIONINFO) As Long Private Declare Sub keybd_event Lib "user32" _ (ByVal bVk As Byte, _ ByVal bScan As Byte, _ ByVal dwFlags As Long, ByVal dwExtraInfo As Long) Private Declare Function GetKeyboardState Lib "user32" _ (pbKeyState As Byte) As Long Private Declare Function SetKeyboardState Lib "user32" _ (lppbKeyState As Byte) As Long ' Constant declarations: Const VK_NUMLOCK = &H90 Const VK_SCROLL = &H91 Const VK_CAPITAL = &H14 Const KEYEVENTF_EXTENDEDKEY = &H1 Const KEYEVENTF_KEYUP = &H2 Const VER_PLATFORM_WIN32_NT = 2 Const VER_PLATFORM_WIN32_WINDOWS = 1
Private Sub Command1_Click() Dim o As OSVERSIONINFO Dim NumLockState As Boolean Dim ScrollLockState As Boolean Dim CapsLockState As Boolean o.dwOSVersionInfoSize = Len(o) GetVersionEx o Dim keys(0 To 255) As Byte GetKeyboardState keys(0) ' NumLock handling: NumLockState = keys(VK_NUMLOCK) If NumLockState <> True Then 'Turn numlock on If o.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then '=== Win95/98 keys(VK_NUMLOCK) = 1 SetKeyboardState keys(0) ElseIf o.dwPlatformId = VER_PLATFORM_WIN32_NT Then '=== WinNT 'Simulate Key Press keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0 'Simulate Key Release keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY _ Or KEYEVENTF_KEYUP, 0 End If End If ' CapsLock handling: CapsLockState = keys(VK_CAPITAL) If CapsLockState <> True Then 'Turn capslock on If o.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then '=== Win95/98 keys(VK_CAPITAL) = 1 SetKeyboardState keys(0) ElseIf o.dwPlatformId = VER_PLATFORM_WIN32_NT Then '=== WinNT 'Simulate Key Press keybd_event VK_CAPITAL, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0 'Simulate Key Release keybd_event VK_CAPITAL, &H45, KEYEVENTF_EXTENDEDKEY _ Or KEYEVENTF_KEYUP, 0 End If End If ' ScrollLock handling: ScrollLockState = keys(VK_SCROLL) If ScrollLockState <> True Then 'Turn Scroll lock on If o.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then '=== Win95/98 keys(VK_SCROLL) = 1 SetKeyboardState keys(0) ElseIf o.dwPlatformId = VER_PLATFORM_WIN32_NT Then '=== WinNT 'Simulate Key Press keybd_event VK_SCROLL, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0 'Simulate Key Release keybd_event VK_SCROLL, &H45, KEYEVENTF_EXTENDEDKEY _ Or KEYEVENTF_KEYUP, 0 End If End If End Sub
127190 : HOWT Toggle the NUM LOCK, CAPS LOCK, and SCROLL LOCK Keys
Last Reviewed: | 5/13/2003 (2.0) |
Keywords: | kbhowto KB177674 |
' Declare Type for API call: Private Type OSVERSIONINFO dwOSVersionInfoSize As Long dwMajorVersion As Long dwMinorVersion As Long dwBuildNumber As Long dwPlatformId As Long szCSDVersion As String * 128 ' Maintenance string for PSS usage End Type ' API declarations: Private Declare Function GetVersionEx Lib "kernel32" _ Alias "GetVersionExA" _ (lpVersionInformation As OSVERSIONINFO) As Long Private Declare Sub keybd_event Lib "user32" _ (ByVal bVk As Byte, _ ByVal bScan As Byte, _ ByVal dwFlags As Long, ByVal dwExtraInfo As Long) Private Declare Function GetKeyboardState Lib "user32" _ (pbKeyState As Byte) As Long Private Declare Function SetKeyboardState Lib "user32" _ (lppbKeyState As Byte) As Long ' Constant declarations: Const VK_NUMLOCK = &H90 Const VK_SCROLL = &H91 Const VK_CAPITAL = &H14 Const KEYEVENTF_EXTENDEDKEY = &H1 Const KEYEVENTF_KEYUP = &H2 Const VER_PLATFORM_WIN32_NT = 2 Const VER_PLATFORM_WIN32_WINDOWS = 1
Private Sub Command1_Click() Dim o As OSVERSIONINFO Dim NumLockState As Boolean Dim ScrollLockState As Boolean Dim CapsLockState As Boolean o.dwOSVersionInfoSize = Len(o) GetVersionEx o Dim keys(0 To 255) As Byte GetKeyboardState keys(0) ' NumLock handling: NumLockState = keys(VK_NUMLOCK) If NumLockState <> True Then 'Turn numlock on If o.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then '=== Win95/98 keys(VK_NUMLOCK) = 1 SetKeyboardState keys(0) ElseIf o.dwPlatformId = VER_PLATFORM_WIN32_NT Then '=== WinNT 'Simulate Key Press keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0 'Simulate Key Release keybd_event VK_NUMLOCK, &H45, KEYEVENTF_EXTENDEDKEY _ Or KEYEVENTF_KEYUP, 0 End If End If ' CapsLock handling: CapsLockState = keys(VK_CAPITAL) If CapsLockState <> True Then 'Turn capslock on If o.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then '=== Win95/98 keys(VK_CAPITAL) = 1 SetKeyboardState keys(0) ElseIf o.dwPlatformId = VER_PLATFORM_WIN32_NT Then '=== WinNT 'Simulate Key Press keybd_event VK_CAPITAL, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0 'Simulate Key Release keybd_event VK_CAPITAL, &H45, KEYEVENTF_EXTENDEDKEY _ Or KEYEVENTF_KEYUP, 0 End If End If ' ScrollLock handling: ScrollLockState = keys(VK_SCROLL) If ScrollLockState <> True Then 'Turn Scroll lock on If o.dwPlatformId = VER_PLATFORM_WIN32_WINDOWS Then '=== Win95/98 keys(VK_SCROLL) = 1 SetKeyboardState keys(0) ElseIf o.dwPlatformId = VER_PLATFORM_WIN32_NT Then '=== WinNT 'Simulate Key Press keybd_event VK_SCROLL, &H45, KEYEVENTF_EXTENDEDKEY Or 0, 0 'Simulate Key Release keybd_event VK_SCROLL, &H45, KEYEVENTF_EXTENDEDKEY _ Or KEYEVENTF_KEYUP, 0 End If End If End Sub
127190 : HOWT Toggle the NUM LOCK, CAPS LOCK, and SCROLL LOCK Keys
Last Reviewed: | 5/13/2003 (2.0) |
Keywords: | kbhowto KB177674 |
以下是引用菱角在2004-5-11 8:19:00的发言:Private Type KeyboardBytes kbByte(0 To 255) As Byte End Type
Declare Function GetKeyboardState Lib "user32" (pbKeyState As KeyboardBytes) As Long
Sub test() Dim kbarray As KeyboardBytes GetKeyboardState kbarray MsgBox "caps lock=" & kbarray.kbByte(20) MsgBox "num lock=" & kbarray.kbByte(144) MsgBox "scroll lock=" & kbarray.kbByte(145) End Sub
很好,以学了一招
欢迎光临 ExcelHome技术论坛 (https://club.excelhome.net/) | Powered by Discuz! X3.4 |