Option Explicit
Public Declare Function SetGlobalKeyboardHook Lib "KeyboardHook.dll" ( _
ByVal hWnd As Long, _
ByVal wMsgs As Long _
) As Long
Public Declare Function FreeGlobalKeyboardHook Lib "KeyboardHook.dll" ( _
) As Long
Private Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" (ByRef hpvDest As Any, ByRef hpvSource As Any, ByVal cbCopy As Long)
Private Const WM_COPYDATA As Long = &H4A&
Private Type COPYDATASTRUCT
dwData As Long
cbData As Long
lpData As Long
End Type
Private Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Const GWL_WNDPROC As Long = (-4&)
Private m_pPrevWndProc As Long
Public Const WM_KEYDOWN = &H100
Public Const WM_KEYFIRST = &H100
Public Const WM_KEYLAST = &H108
Public Const WM_KEYUP = &H101
Private m_BitPos32(0 To 31) As Long
Private Sub InitBitPositions32()
m_BitPos32(0) = 1
m_BitPos32(31) = -2147483648#
Dim i As Long
For i = 1 To 30
m_BitPos32(i) = m_BitPos32(i - 1) * 2
Next i
End Sub
Public Function IsBitSet32(ByVal Word As Long, ByVal BitNumber As Long) As Boolean
IsBitSet32 = Word And m_BitPos32(BitNumber)
End Function
Public Sub Init(ByVal hWnd As Long)
Call InitBitPositions32
m_pPrevWndProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf SubWndProc)
End Sub
Public Sub Terminate(ByVal hWnd As Long)
Call SetWindowLong(hWnd, GWL_WNDPROC, m_pPrevWndProc)
End Sub
Public Function SubWndProc(ByVal hWnd As Long, ByVal MSG As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
If MSG = WM_COPYDATA Then
Call ReceiveMsg(lParam)
End If
SubWndProc = CallWindowProc(m_pPrevWndProc, hWnd, MSG, wParam, lParam)
End Function
Public Sub ReceiveMsg(ByVal lParam As Long)
Dim cds As COPYDATASTRUCT
Dim RepeatCount As Integer
Dim ScanCode As Byte
Call CopyMemory(cds, ByVal lParam, Len(cds))
Call CopyMemory(RepeatCount, ByVal VarPtr(cds.lpData), 2)
Call CopyMemory(ScanCode, ByVal VarPtr(cds.lpData) + 2, 1)
FMain.lblInfo.Caption = _
"Transition State Flag: " & CStr(IsBitSet32(cds.lpData, 31)) & vbNewLine & _
"Previous Key State Flag: " & CStr(IsBitSet32(cds.lpData, 30)) & vbNewLine & _
"Context Code: " & CStr(IsBitSet32(cds.lpData, 29)) & vbNewLine & _
"Extended Key Flag: " & CStr(IsBitSet32(cds.lpData, 24)) & vbNewLine & _
"Key Repeat Count: " & CStr(RepeatCount) & vbNewLine & _
"Scan Code: " & CStr(ScanCode)
Call AddItem(KeyCodeToString(cds.dwData) & vbTab & "(" & CStr(cds.dwData) & ")" & vbTab & CStr(cds.lpData))
End Sub
Private Function KeyCodeToString(ByVal KeyCode As Long) As String
Dim t As String
Select Case KeyCode
Case VK_LBUTTON: t = "VK_LBUTTON"
Case VK_RBUTTON: t = "VK_RBUTTON"
Case VK_CANCEL: t = "VK_CANCEL"
Case VK_MBUTTON: t = "VK_MBUTTON"
Case VK_XBUTTON1: t = "VK_XBUTTON1"
Case VK_XBUTTON2: t = "VK_XBUTTON2"
Case VK_BACK: t = "VK_BACK"
Case VK_TAB: t = "VK_TAB"
Case VK_CLEAR: t = "VK_CLEAR"
Case VK_RETURN: t = "VK_RETURN"
Case VK_SHIFT: t = "VK_SHIFT"
Case VK_CONTROL: t = "VK_CONTROL"
Case VK_MENU: t = "VK_MENU"
Case VK_PAUSE: t = "VK_PAUSE"
Case VK_CAPITAL: t = "VK_CAPITAL"
Case VK_KANA: t = "VK_KANA"
Case VK_HANGEUL: t = "VK_HANGEUL"
Case VK_HANGUL: t = "VK_HANGUL"
Case VK_JUNJA: t = "VK_JUNJA"
Case VK_FINAL: t = "VK_FINAL"
Case VK_HANJA: t = "VK_HANJA"
Case VK_KANJI: t = "VK_KANJI"
Case VK_ESCAPE: t = "VK_ESCAPE"
Case VK_CONVERT: t = "VK_CONVERT"
Case VK_NONCONVERT: t = "VK_NONCONVERT"
Case VK_ACCEPT: t = "VK_ACCEPT"
Case VK_MODECHANGE: t = "VK_MODECHANGE"
Case VK_SPACE: t = "VK_SPACE"
Case VK_PRIOR: t = "VK_PRIOR"
Case VK_NEXT: t = "VK_NEXT"
Case VK_END: t = "VK_END"
Case VK_HOME: t = "VK_HOME"
Case VK_LEFT: t = "VK_LEFT"
Case VK_UP: t = "VK_UP"
Case VK_RIGHT: t = "VK_RIGHT"
Case VK_DOWN: t = "VK_DOWN"
Case VK_SELECT: t = "VK_SELECT"
Case VK_PRINT: t = "VK_PRINT"
Case VK_EXECUTE: t = "VK_EXECUTE"
Case VK_SNAPSHOT: t = "VK_SNAPSHOT"
Case VK_INSERT: t = "VK_INSERT"
Case VK_DELETE: t = "VK_DELETE"
Case VK_HELP: t = "VK_HELP"
Case VK_0: t = "VK_0"
Case VK_1: t = "VK_1"
Case VK_2: t = "VK_2"
Case VK_3: t = "VK_3"
Case VK_4: t = "VK_4"
Case VK_5: t = "VK_5"
Case VK_6: t = "VK_6"
Case VK_7: t = "VK_7"
Case VK_8: t = "VK_8"
Case VK_9: t = "VK_9"
Case VK_A: t = "VK_A"
Case VK_B: t = "VK_B"
Case VK_C: t = "VK_C"
Case VK_D: t = "VK_D"
Case VK_E: t = "VK_E"
Case VK_F: t = "VK_F"
Case VK_G: t = "VK_G"
Case VK_H: t = "VK_H"
Case VK_I: t = "VK_I"
Case VK_J: t = "VK_J"
Case VK_K: t = "VK_K"
Case VK_L: t = "VK_L"
Case VK_M: t = "VK_M"
Case VK_N: t = "VK_N"
Case VK_O: t = "VK_O"
Case VK_P: t = "VK_P"
Case VK_Q: t = "VK_Q"
Case VK_R: t = "VK_R"
Case VK_S: t = "VK_S"
Case VK_T: t = "VK_T"
Case VK_U: t = "VK_U"
Case VK_V: t = "VK_V"
Case VK_W: t = "VK_Q"
Case VK_X: t = "VK_X"
Case VK_Y: t = "VK_Y"
Case VK_Z: t = "VK_Z"
Case VK_LWIN: t = "VK_LWIN"
Case VK_RWIN: t = "VK_RWIN"
Case VK_APPS: t = "VK_APPS"
Case VK_SLEEP: t = "VK_SLEEP"
Case VK_NUMPAD0: t = "VK_NUMPAD0"
Case VK_NUMPAD1: t = "VK_NUMPAD1"
Case VK_NUMPAD2: t = "VK_NUMPAD2"
Case VK_NUMPAD3: t = "VK_NUMPAD3"
Case VK_NUMPAD4: t = "VK_NUMPAD4"
Case VK_NUMPAD5: t = "VK_NUMPAD5"
Case VK_NUMPAD6: t = "VK_NUMPAD6"
Case VK_NUMPAD7: t = "VK_NUMPAD7"
Case VK_NUMPAD8: t = "VK_NUMPAD8"
Case VK_NUMPAD9: t = "VK_NUMPAD9"
Case VK_MULTIPLY: t = "VK_MULTIPLY"
Case VK_ADD: t = "VK_ADD"
Case VK_SEPARATOR: t = "VK_SEPARATOR"
Case VK_SUBTRACT: t = "VK_SUBTRACT"
Case VK_DECIMAL: t = "VK_DECIMAL"
Case VK_DIVIDE: t = "VK_DIVIDE"
Case VK_F1: t = "VK_F1"
Case VK_F2: t = "VK_F2"
Case VK_F3: t = "VK_F3"
Case VK_F4: t = "VK_F4"
Case VK_F5: t = "VK_F5"
Case VK_F6: t = "VK_F6"
Case VK_F7: t = "VK_F7"
Case VK_F8: t = "VK_F8"
Case VK_F9: t = "VK_F9"
Case VK_F10: t = "VK_F10"
Case VK_F11: t = "VK_F11"
Case VK_F12: t = "VK_F12"
Case VK_F13: t = "VK_F13"
Case VK_F14: t = "VK_F14"
Case VK_F15: t = "VK_F15"
Case VK_F16: t = "VK_F16"
Case VK_F17: t = "VK_F17"
Case VK_F18: t = "VK_F18"
Case VK_F19: t = "VK_F19"
Case VK_F20: t = "VK_F20"
Case VK_F21: t = "VK_F21"
Case VK_F22: t = "VK_F22"
Case VK_F23: t = "VK_F23"
Case VK_F24: t = "VK_F24"
Case VK_NUMLOCK: t = "VK_NUMLOCK"
Case VK_SCROLL: t = "VK_SCROLL"
Case VK_OEM_NEC_EQUAL: t = "VK_OEM_NEC_EQUAL"
Case VK_OEM_FJ_JISHO: t = "VK_OEM_FJ_JISHO"
Case VK_OEM_FJ_MASSHOU: t = "VK_OEM_FJ_MASSHOU"
Case VK_OEM_FJ_TOUROKU: t = "VK_OEM_FJ_TOUROKU"
Case VK_OEM_FJ_LOYA: t = "VK_OEM_FJ_LOYA"
Case VK_OEM_FJ_ROYA: t = "VK_OEM_FJ_ROYA"
Case VK_LSHIFT: t = "VK_LSHIFT"
Case VK_RSHIFT: t = "VK_RSHIFT"
Case VK_LCONTROL: t = "VK_LCONTROL"
Case VK_RCONTROL: t = "VK_RCONTROL"
Case VK_LMENU: t = "VK_LMENU"
Case VK_RMENU: t = "VK_RMENU"
Case VK_BROWSER_BACK: t = "VK_BROWSER_BACK"
Case VK_BROWSER_FORWARD
t = "VK_BROWSER_FORWARD"
Case VK_BROWSER_REFRESH
t = "VK_BROWSER_REFRESH"
Case VK_BROWSER_STOP: t = "VK_BROWSER_STOP"
Case VK_BROWSER_SEARCH: t = "VK_BROWSER_SEARCH"
Case VK_BROWSER_FAVORITES
t = "VK_BROWSER_FAVORITES"
Case VK_BROWSER_HOME: t = "VK_BROWSER_HOME"
Case VK_VOLUME_MUTE: t = "VK_VOLUME_MUTE"
Case VK_VOLUME_DOWN: t = "VK_VOLUME_DOWN"
Case VK_VOLUME_UP: t = "VK_VOLUME_UP"
Case VK_MEDIA_NEXT_TRACK
t = "VK_MEDIA_NEXT_TRACK"
Case VK_MEDIA_PREV_TRACK
t = "VK_MEDIA_PREV_TRACK"
Case VK_MEDIA_STOP: t = "VK_MEDIA_STOP"
Case VK_MEDIA_PLAY_PAUSE
t = "VK_MEDIA_PLAY_PAUSE"
Case VK_LAUNCH_MAIL: t = "VK_LAUNCH_MAIL"
Case VK_LAUNCH_MEDIA_SELECT
t = "VK_LAUNCH_MEDIA_SELECT"
Case VK_LAUNCH_APP1: t = "VK_LAUNCH_APP1"
Case VK_LAUNCH_APP2: t = "VK_LAUNCH_APP2"
Case VK_OEM_1: t = "VK_OEM_1"
Case VK_OEM_PLUS: t = "VK_OEM_PLUS"
Case VK_OEM_COMMA: t = "VK_OEM_COMMA"
Case VK_OEM_MINUS: t = "VK_OEM_MINUS"
Case VK_OEM_PERIOD: t = "VK_OEM_PERIOD"
Case VK_OEM_2: t = "VK_OEM_2"
Case VK_OEM_3: t = "VK_OEM_3"
Case VK_OEM_4: t = "VK_OEM_4"
Case VK_OEM_5: t = "VK_OEM_5"
Case VK_OEM_6: t = "VK_OEM_6"
Case VK_OEM_7: t = "VK_OEM_7"
Case VK_OEM_8: t = "VK_OEM_8"
Case VK_OEM_AX: t = "VK_OEM_AX"
Case VK_OEM_102: t = "VK_OEM_102"
Case VK_ICO_HELP: t = "VK_ICO_HELP"
Case VK_ICO_00: t = "VK_ICO_00"
Case VK_PROCESSKEY: t = "VK_PROCESSKEY"
Case VK_ICO_CLEAR: t = "VK_ICO_CLEAR"
Case VK_PACKET: t = "VK_PACKET"
Case VK_OEM_RESET: t = "VK_OEM_RESET"
Case VK_OEM_JUMP: t = "VK_OEM_JUMP"
Case VK_OEM_PA1: t = "VK_OEM_PA1"
Case VK_OEM_PA2: t = "VK_OEM_PA2"
Case VK_OEM_PA3: t = "VK_OEM_PA3"
Case VK_OEM_WSCTRL: t = "VK_OEM_WSCTRL"
Case VK_OEM_CUSEL: t = "VK_OEM_CUSEL"
Case VK_OEM_ATTN: t = "VK_OEM_ATTN"
Case VK_OEM_FINISH: t = "VK_OEM_FINISH"
Case VK_OEM_COPY: t = "VK_OEM_COPY"
Case VK_OEM_AUTO: t = "VK_OEM_AUTO"
Case VK_OEM_ENLW: t = "VK_OEM_ENLW"
Case VK_OEM_BACKTAB: t = "VK_OEM_BACKTAB"
Case VK_ATTN: t = "VK_ATTN"
Case VK_CRSEL: t = "VK_CRSEL"
Case VK_EXSEL: t = "VK_EXSEL"
Case VK_EREOF: t = "VK_EREOF"
Case VK_PLAY: t = "VK_PLAY"
Case VK_ZOOM: t = "VK_ZOOM"
Case VK_NONAME: t = "VK_NONAME"
Case VK_PA1: t = "VK_PA1"
Case VK_OEM_CLEAR: t = "VK_OEM_CLEAR"
Case Else: t = KeyCode
End Select
KeyCodeToString = t
End Function
Private Sub AddItem(ByVal Text As String)
With FMain.lstKeyboardEvents
If .ListCount > 30 Then
Call .RemoveItem(0)
End If
Call .AddItem(Text)
.ListIndex = .NewIndex
End With
End Sub