|
說明 如果說,我們想得知某些鍵被KeyIn的頻率,或許會想,那設定Form KeyPreview不就可以,是啊,不過這樣做就變成您要使用者對著您的Form做事才有,出了這個Form就沒有辦法了,所以又要使用其他的方式了,第一個想到的是KeyBoard
Hook,是的,這是一個正確的想法。 程式 '以下程式在.BAS Public Const WM_KEYUP = &H101 Public Const HC_ACTION = 0 Public Const WH_JOURNALRECORD = 0 Type EVENTMSG message As Long paramL As Long paramH As Long time As Long hwnd As Long End Type 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 Declare Function UnhookWindowsHookEx Lib "user32" _ (ByVal hHook As Long) As Long Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, _ ByVal nCode As Long, ByVal wParam As Long, lParam As Any) As Long Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" _ (lpvDest As Any, ByVal lpvSource As Long, ByVal cbCopy As Long) Declare Function MapVirtualKey Lib "user32" Alias "MapVirtualKeyA" _ (ByVal wCode As Long, ByVal wMapType As Long) As Long Declare Function GetAsyncKeyState Lib "user32" (ByVal vKey As Long) As Integer Public hHook As Long ' handle of Hook Procedure Public msg As EVENTMSG Sub EnableHook() hHook = SetWindowsHookEx(0, AddressOf HookProc, App.hInstance, 0) End Sub Sub FreeHook() Dim ret As Long ret = UnhookWindowsHookEx(hHook) End Sub Function HookProc(ByVal code As Long, ByVal wParam As Long, _ ByVal lParam As Long) As Long Dim i As Long, j As Integer If code <> HC_ACTION Then HookProc = CallNextHookEx(hHook, code, wParam, lParam) Exit Function End If CopyMemory msg, lParam, LenB(msg) If msg.message = WM_KEYUP Then j = GetAsyncKeyState(vbKeyShift) 'Check Shift是否正按下 i = MapVirtualKey(msg.paramL, 2) '轉換成unshift Ascii Code If j <> 0 Then Debug.Print Chr(i And &HFF); " Key Up with Shift Down" Else Debug.Print Chr(i And &HFF); " Key Up without Shift Down" End If End If If msg.message = WM_KEYDOWN Then j = GetAsyncKeyState(vbKeyShift) i = MapVirtualKey(msg.paramL, 2) If j <> 0 Then Debug.Print Chr(i And &HFF); " Key Down with Shift Down" Else Debug.Print Chr(i And &HFF); " Key Down without Shift Down" End If End If HookProc = CallNextHookEx(hHook, code, wParam, lParam) End Function '-------------------------------------------------------------------------------------------- '以下程式在Form Private Sub Form_Load() Call EnableHook End Sub Private Sub Form_Unload(Cancel As Integer) Call FreeHook End Sub 相關資訊 文件出處
|
|
|
如果對本站有任何建議,歡迎來信給Honey,我們會盡快給您答覆 |