Private Declare Function GetKeyState Lib "User32" (ByVal nVirtKey As Long) As Integer ' Virtual key values Const VK_TAB = &H9 Const VK_SHIFT = &H10
Sub txtAreaCode_LostFocus() Dim iRetVal As Integer
' Check for a tab out of this control ' Skip the state field iRetVal = GetKeyState(VK_SHIFT) ' 如果没有按shift,检查tab If iRetVal <> -128 And iRetVal <> -127 Then iRetVal = GetKeyState(VK_TAB) If iRetVal = -128 Or iRetVal = -127 Then ' tab键按下 txtPhone.SetFocus End If End If End Sub Private Const VK_Ctrl = (键盘虚拟码) Private Const VK_C = (键盘虚拟码) keybd_event VK_Ctrl, 0, 0, 0 '(虚拟键位按下) Sleep 300 keybd_event VK_C, 0, 0, 0 '(虚拟键位按下) Sleep 300 keybd_event VK_C, 0, &H2, 0(虚拟按键 弹起) Sleep 100 keybd_event VK_Ctrl, 0, &H2, 0 (虚拟按键 弹起)延时是必须的 没有延时将达不到效果 但是时间可以短些,windows 处理消息不是即使的写程序用给出相当的延时 有益于程序的稳定……sleep的API 声明:Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongVB 屏蔽键盘(包含组合键) 2008-12-14 21:39 Option Explicit Public 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 Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy As Long) Public Type KEYMSGS vKey As Long sKey As Long flag As Long time As Long End Type Public Const TH32CS_SNAPPROCESS = &H2& Public Const SPI_SCREENSAVERRUNNING = 97 Public Const WH_KEYBOARD_LL = 13 Public Const VK_LWIN = &H5B Public Const VK_RWIN = &H5C Public Const HC_ACTION = 0 Public Const HC_SYSMODALOFF = 5 Public Const HC_SYSMODALON = 4 Public Const WM_KEYDOWN = &H100 Public Const WM_KEYUP = &H101 Public Const WM_SYSKEYDOWN = &H104 Public Const WM_SYSKEYUP = &H105 Public Const VK_BACK = &H8 Public Const VK_TAB = &H9 Public Const VK_ESCAPE = &H1B Public Const VK_F5 = &H74 Public Const VK_CONTROL = &H11 Dim FileNumber As Integer Public P As KEYMSGS Public lHook As Long Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer Public Const VK_ATTN = &HF6 Public Function LowLevelKeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Dim fEatKeystroke As Boolean If (nCode = HC_ACTION) Then If wParam = WM_KEYDOWN Or wParam = WM_SYSKEYDOWN Or wParam = WM_KEYUP Or wParam = WM_SYSKEYUP Then CopyMemory P, ByVal lParam, Len(P) Select Case P.vKey Case VK_LWIN, VK_RWIN '如果按了WIN键 fEatKeystroke = True '就吃了 Case VK_ESCAPE 'esc fEatKeystroke = True Case VK_F5 'f5 fEatKeystroke = True Case 115 'F4 fEatKeystroke = True Case 164, 165 'alt fEatKeystroke = True End Select Debug.Print P.vKey If P.vKey = 160 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+shift If P.vKey = 161 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+shift If P.vKey = 32 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+空格 If P.vKey = 78 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+n If P.vKey = 82 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+ r If P.vKey = 81 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+ q If P.vKey = 87 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+ w If P.vKey = 69 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+e If P.vKey = 73 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+i If P.vKey = 79 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+o If P.vKey = 80 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+p If P.vKey = 68 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+d If P.vKey = 70 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+f If P.vKey = 72 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+h If P.vKey = 76 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+l If P.vKey = 78 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+n If P.vKey = 66 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+b If P.vKey = 37 And GetAsyncKeyState(VK_ATTN) Then fEatKeystroke = True 'ALT+< If P.vKey = 39 And GetAsyncKeyState(VK_ATTN) Then fEatKeystroke = True 'ALT+< End If End If If fEatKeystroke Then LowLevelKeyboardProc = -1 Else LowLevelKeyboardProc = CallNextHookEx(0, nCode, wParam, ByVal lParam) End If End Function Public Function HOOK() As Boolean On Error GoTo errh lHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0) HOOK = True Exit Function errh: HOOK = False End Function Public Sub UNHOOK() UnhookWindowsHookEx lHook End Sub
这段代码就可以实现通过按S键,使窗口进行 显示/隐藏 的切换:Option ExplicitPrivate Declare Function GetKeyState Lib "user32" (ByVal nVirtKey As Long) As IntegerDim lFlag&, lWinSta&Private Sub Form_Load() lFlag = 0 lWinSta = -1 Timer1.Interval = 50 Timer1.Enabled = True End SubPrivate Sub Timer1_Timer() If (lFlag = 0) Then If (GetKeyState(vbKeyS) And &H8000&) Then lFlag = 1 lWinSta = Not lWinSta Me.Visible = lWinSta End If Else lFlag = GetKeyState(vbKeyS) And &H8000& End If End Sub
'Example Name: Activating CapsLock and NumLock on Win9x '------------------------------------------------------------------------------ ' ' BAS Moduel Code ' '------------------------------------------------------------------------------ Option ExplicitPublic Const VK_CAPITAL = &H14Public Type KeyboardBytes kbByte(0 To 255) As Byte End TypePublic kbArray As KeyboardBytesPublic Declare Function GetKeyState Lib "user32" _ (ByVal nVirtKey As Long) As LongPublic Declare Function GetKeyboardState Lib "user32" _ (kbArray As KeyboardBytes) As LongPublic Declare Function SetKeyboardState Lib "user32" _ (kbArray As KeyboardBytes) As Long '--end block--' '------------------------------------------------------------------------------ ' ' Form Code ' '------------------------------------------------------------------------------ Option ExplicitPrivate Sub Form_Load() Label1.Caption = IIf(CapsLock() = 1, "On", "Off")End Sub Function CapsLock() As Boolean
CapsLock = GetKeyState(VK_CAPITAL) And 1 = 1
End Function Private Sub Command1_Click() GetKeyboardState kbArray kbArray.kbByte(VK_CAPITAL) = IIf(kbArray.kbByte(VK_CAPITAL) = 1, 0, 1) SetKeyboardState kbArray Label1.Caption = IIf(CapsLock() = 1, "On", "Off")End Sub Private Sub Command2_Click() GetKeyboardState kbArray kbArray.kbByte(VK_CAPITAL) = 1 SetKeyboardState kbArray Label1.Caption = IIf(CapsLock() = 1, "On", "Off")End Sub Private Sub Command3_Click() GetKeyboardState kbArray kbArray.kbByte(VK_CAPITAL) = 0 SetKeyboardState kbArray Label1.Caption = IIf(CapsLock() = 1, "On", "Off")End Sub
Private Declare Function GetKeyState Lib "User32" (ByVal nVirtKey As Long) As Integer
' Virtual key values
Const VK_TAB = &H9
Const VK_SHIFT = &H10
Sub txtAreaCode_LostFocus()
Dim iRetVal As Integer
' Check for a tab out of this control
' Skip the state field
iRetVal = GetKeyState(VK_SHIFT)
' 如果没有按shift,检查tab
If iRetVal <> -128 And iRetVal <> -127 Then
iRetVal = GetKeyState(VK_TAB)
If iRetVal = -128 Or iRetVal = -127 Then ' tab键按下
txtPhone.SetFocus
End If
End If
End Sub
Private Const VK_Ctrl = (键盘虚拟码)
Private Const VK_C = (键盘虚拟码)
keybd_event VK_Ctrl, 0, 0, 0 '(虚拟键位按下)
Sleep 300
keybd_event VK_C, 0, 0, 0 '(虚拟键位按下)
Sleep 300
keybd_event VK_C, 0, &H2, 0(虚拟按键 弹起)
Sleep 100
keybd_event VK_Ctrl, 0, &H2, 0 (虚拟按键 弹起)延时是必须的 没有延时将达不到效果 但是时间可以短些,windows 处理消息不是即使的写程序用给出相当的延时 有益于程序的稳定……sleep的API 声明:Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As LongVB 屏蔽键盘(包含组合键)
2008-12-14 21:39
Option Explicit
Public 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
Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long
Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy As Long)
Public Type KEYMSGS
vKey As Long
sKey As Long
flag As Long
time As Long
End Type
Public Const TH32CS_SNAPPROCESS = &H2&
Public Const SPI_SCREENSAVERRUNNING = 97
Public Const WH_KEYBOARD_LL = 13
Public Const VK_LWIN = &H5B
Public Const VK_RWIN = &H5C
Public Const HC_ACTION = 0
Public Const HC_SYSMODALOFF = 5
Public Const HC_SYSMODALON = 4
Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101
Public Const WM_SYSKEYDOWN = &H104
Public Const WM_SYSKEYUP = &H105
Public Const VK_BACK = &H8
Public Const VK_TAB = &H9
Public Const VK_ESCAPE = &H1B
Public Const VK_F5 = &H74
Public Const VK_CONTROL = &H11
Dim FileNumber As Integer
Public P As KEYMSGS
Public lHook As Long
Public Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer
Public Const VK_ATTN = &HF6
Public Function LowLevelKeyboardProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim fEatKeystroke As Boolean
If (nCode = HC_ACTION) Then
If wParam = WM_KEYDOWN Or wParam = WM_SYSKEYDOWN Or wParam = WM_KEYUP Or wParam = WM_SYSKEYUP Then
CopyMemory P, ByVal lParam, Len(P)
Select Case P.vKey
Case VK_LWIN, VK_RWIN '如果按了WIN键
fEatKeystroke = True '就吃了
Case VK_ESCAPE 'esc
fEatKeystroke = True
Case VK_F5 'f5
fEatKeystroke = True
Case 115 'F4
fEatKeystroke = True
Case 164, 165 'alt
fEatKeystroke = True
End Select
Debug.Print P.vKey
If P.vKey = 160 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+shift
If P.vKey = 161 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+shift
If P.vKey = 32 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+空格
If P.vKey = 78 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+n
If P.vKey = 82 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+ r
If P.vKey = 81 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+ q
If P.vKey = 87 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+ w
If P.vKey = 69 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+e
If P.vKey = 73 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+i
If P.vKey = 79 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+o
If P.vKey = 80 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+p
If P.vKey = 68 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+d
If P.vKey = 70 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+f
If P.vKey = 72 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+h
If P.vKey = 76 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+l
If P.vKey = 78 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+n
If P.vKey = 66 And GetAsyncKeyState(VK_CONTROL) Then fEatKeystroke = True 'ctrl+b
If P.vKey = 37 And GetAsyncKeyState(VK_ATTN) Then fEatKeystroke = True 'ALT+<
If P.vKey = 39 And GetAsyncKeyState(VK_ATTN) Then fEatKeystroke = True 'ALT+<
End If
End If
If fEatKeystroke Then
LowLevelKeyboardProc = -1
Else
LowLevelKeyboardProc = CallNextHookEx(0, nCode, wParam, ByVal lParam)
End If
End Function
Public Function HOOK() As Boolean
On Error GoTo errh
lHook = SetWindowsHookEx(WH_KEYBOARD_LL, AddressOf LowLevelKeyboardProc, App.hInstance, 0)
HOOK = True
Exit Function
errh:
HOOK = False
End Function
Public Sub UNHOOK()
UnhookWindowsHookEx lHook
End Sub
然后Timer控件在事件过程中检查需要监视的按键是否按下就行了。
lFlag = 0
lWinSta = -1
Timer1.Interval = 50
Timer1.Enabled = True
End SubPrivate Sub Timer1_Timer()
If (lFlag = 0) Then
If (GetKeyState(vbKeyS) And &H8000&) Then
lFlag = 1
lWinSta = Not lWinSta
Me.Visible = lWinSta
End If
Else
lFlag = GetKeyState(vbKeyS) And &H8000&
End If
End Sub
'Example Name: Activating CapsLock and NumLock on Win9x '------------------------------------------------------------------------------
'
' BAS Moduel Code
'
'------------------------------------------------------------------------------
Option ExplicitPublic Const VK_CAPITAL = &H14Public Type KeyboardBytes
kbByte(0 To 255) As Byte
End TypePublic kbArray As KeyboardBytesPublic Declare Function GetKeyState Lib "user32" _
(ByVal nVirtKey As Long) As LongPublic Declare Function GetKeyboardState Lib "user32" _
(kbArray As KeyboardBytes) As LongPublic Declare Function SetKeyboardState Lib "user32" _
(kbArray As KeyboardBytes) As Long
'--end block--'
'------------------------------------------------------------------------------
'
' Form Code
'
'------------------------------------------------------------------------------
Option ExplicitPrivate Sub Form_Load() Label1.Caption = IIf(CapsLock() = 1, "On", "Off")End Sub
Function CapsLock() As Boolean
CapsLock = GetKeyState(VK_CAPITAL) And 1 = 1
End Function
Private Sub Command1_Click() GetKeyboardState kbArray
kbArray.kbByte(VK_CAPITAL) = IIf(kbArray.kbByte(VK_CAPITAL) = 1, 0, 1)
SetKeyboardState kbArray Label1.Caption = IIf(CapsLock() = 1, "On", "Off")End Sub
Private Sub Command2_Click() GetKeyboardState kbArray
kbArray.kbByte(VK_CAPITAL) = 1
SetKeyboardState kbArray Label1.Caption = IIf(CapsLock() = 1, "On", "Off")End Sub
Private Sub Command3_Click() GetKeyboardState kbArray
kbArray.kbByte(VK_CAPITAL) = 0
SetKeyboardState kbArray Label1.Caption = IIf(CapsLock() = 1, "On", "Off")End Sub
否则你按下S键时,窗口就已经 显示/隐藏 很多次了。
有这个,就能保证你按下时,只切换一次状态;你必须放开后再按下,才能再次切换状态。变量 lWinSta 是标识窗口显示状态的。
可以不用,改成这样就行了:
Me.Visible = Not Me.Visible
用变量来标识,是为了减少‘访问对象’的次数。