请看下面代码,我想知道为什么当我按下TAB键时会出来3个提示筐模块代码:
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 LongPublic 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 LongPublic hHook As Long
Public Const WH_KEYBOARD = 2
Public Function MyKBHFunc(ByVal iCode As Long, _
     ByVal wParam As Long, ByVal lParam As Long) As Long
   MyKBHFunc = 0    If wParam = vbKeyTab Then 
     MyKBHFunc = 1 
     MsgBox "TAB"
   End If
   Call CallNextHookEx(hHook, iCode, wParam, lParam) 
 End Function窗口代码:
Private Sub Form_Load()
 hHook = SetWindowsHookEx(WH_KEYBOARD, AddressOf _
             MyKBHFunc, App.hInstance, App.ThreadID)End SubPrivate Sub Form_Unload(Cancel As Integer)
UnhookWindowsHookEx hHook
End Sub

解决方案 »

  1.   

    if  iCode = 0 then
        If wParam = vbKeyTab Then 
            MyKBHFunc = 1 
            MsgBox "TAB"
        End If
    else
        Call CallNextHookEx(hHook, iCode, wParam, lParam) 
    end if
      

  2.   

    因为在按TAB键的过程中系统会送WM_KEYDOWN、WM_CHAR、WM_KEYUP到你的窗口过程,因此一下函数会被调用3次
    Public Function MyKBHFunc(ByVal iCode As Long, _
         ByVal wParam As Long, ByVal lParam As Long) As Long
       MyKBHFunc = 0    If wParam = vbKeyTab Then 
         MyKBHFunc = 1 
         MsgBox "TAB"
       End If
       Call CallNextHookEx(hHook, iCode, wParam, lParam) 
     End Function