做好的程序窗体上的checkbox怎么用键盘操作?就是怎么用键盘使得勾上或取消勾?非得用鼠标才行吗
做好的程序窗体上的checkbox如何用键盘操作?就是如何用键盘使得勾上或取消勾?非得用鼠标才行吗?
topic:做好的程序窗体上的checkbox如何用键盘操作?就是如何用键盘使得勾上或取消勾?非得用鼠标才行吗?
包括比如像网页上的那种checkbox也是,难道非得用鼠标点才行吗?键盘操作不了么?
------解决方案--------------------
空格,回车?
------解决方案--------------------
当然可以,用API HOOK实现。下面程序点小键盘“+”号选中,“-”号取消:
标准模块:
topic:做好的程序窗体上的checkbox如何用键盘操作?就是如何用键盘使得勾上或取消勾?非得用鼠标才行吗?
包括比如像网页上的那种checkbox也是,难道非得用鼠标点才行吗?键盘操作不了么?
------解决方案--------------------
空格,回车?
------解决方案--------------------
当然可以,用API HOOK实现。下面程序点小键盘“+”号选中,“-”号取消:
标准模块:
- VB code
Option Explicit Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef Destination As Any, ByRef Source As Any, ByVal Length As Long) Private Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long Private Declare Function GetKeyboardState Lib "user32 " (pbKeyState As Byte) As Long Private Declare Function GetKeyState Lib "user32" (ByVal nVirkey As Long) As Long Private Declare Function GetKeyNameText Lib "user32" Alias "GetKeyNameTextA" (ByVal lParam As Long, ByVal lpBuffer As String, ByVal nSize As Long) As Long 'Private Declare Sub CopyMemory1 Lib "kernel32" Alias "RtlMoveMemory" (lpvdest As Any, ByVal lpsource As Long, ByVal cbcopy As Long) Private JPhHook As Long Private Declare Function GetActiveWindow Lib "user32" () As Long Private Type KEYMSGS vKey As Long sKey As Long flag As Long time As Long End Type Private keyMsg As KEYMSGS '消息 Private Const WH_KEYBOARD_LL As Long = 13 Private Const HC_ACTION = 0 Private Const HC_SYSMODALOFF = 5 Private Const HC_SYSMODALON = 4 '键盘消息 Private Const WM_KEYDOWN = &H100 Private Const WM_KEYUP = &H101 Private Const WM_SYSKEYDOWN = &H104 Private Const WM_SYSKEYUP = &H105 Public Sub EnableHook() If JPhHook = 0 Then JPhHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf JPHookProc, App.hInstance, 0) End If End Sub Public Sub FreeHook() If JPhHook <> 0 Then Call UnhookWindowsHookEx(JPhHook) End If End Sub Public Function JPHookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Dim IKey As Long Dim strKeyName As String * 255 Dim strLen As Long If nCode = HC_ACTION Then CopyMemory ByVal keyMsg, ByVal lParam, Len(keyMsg) Select Case wParam Case WM_SYSKEYDOWN, WM_KEYDOWN, WM_SYSKEYUP, WM_KEYUP: IKey = keyMsg.sKey And &HFF IKey = IKey * 65536 strLen = 256 strLen = GetKeyNameText(IKey, strKeyName, strLen) Debug.Print "键名:" & Left(strKeyName, InStr(strKeyName, Chr(0)) - 1) Debug.Print "虚拟:" & keyMsg.vKey Debug.Print "扫描码:" & IKey / 65536 If IKey / 65536 = 74 Then Form1.Check1.Value = 0 End If If IKey / 65536 = 78 Then Form1.Check1.Value = 1 End If End Select End If End Function
------解决方案--------------------
tab键将焦点移至该checkbox然后按空格键可以选上或者去掉勾选。