Public feed
#381783
SUB KBHook
LOCAL InterceptKey AS LONG
LOCAL KeyCode AS LONG
LOCAL KeyStroke AS STRING
LOCAL LastKey AS STRING
LOCAL Msg AS TAGMSG
WHILE GetMessage(Msg, %NULL, 0, 0) = %TRUE
KeyStroke = ""
SELECT CASE Msg.message
CASE %WM_KEYDOWN, %WM_SYSKEYDOWN
IF ISTRUE(LOWRD(GetKeyState(%VK_SHIFT)) AND &H8000) THEN
KeyCode = Msg.wParam
IF KeyCode <> 16 THEN
KeyStroke = "SHIFT "
GOSUB WhichKey
IF LEN(LastKey) > 1 THEN
KeyStroke = KeyStroke + LastKey
ELSE
KeyStroke = LastKey
END IF
END IF
ELSEIF ISTRUE(LOWRD(GetKeyState(%VK_CONTROL)) AND &H8000) THEN
KeyCode = Msg.wParam
IF KeyCode <> 17 THEN
GOSUB WhichKey
IF LEN(LastKey) THEN
KeyStroke = "CTRL " + LastKey
END IF
END IF
ELSEIF ISTRUE(LOWRD(GetKeyState(%VK_MENU)) AND &H8000) THEN
KeyCode = Msg.wParam
GOSUB WhichKey
IF LEN(LastKey) THEN
KeyStroke = "ALT " + LastKey
END IF
ELSE
KeyCode = Msg.wParam
GOSUB WhichKey
IF LEN(LastKey) THEN
KeyStroke = LastKey
END IF
END IF
END SELECT
IF KeyStroke <> "" THEN
' This is where you can select which keystrokes to intercept
' and act on, and which keystrokes to pass through to Windows
'
CONTROL SET TEXT hDlg, 100, KeyStroke
'
' Optionally pass keystroke through with following code
'
' IF IsDialogMessage(hDlg, Msg) = %FALSE THEN
' TranslateMessage Msg
' DispatchMessage Msg
' END IF
ELSEIF IsDialogMessage(hDlg, Msg) = %FALSE THEN
TranslateMessage Msg
DispatchMessage Msg
END IF
IF StopKBHook THEN
EXIT SUB
END IF
LOOP
WhichKey: ' GOSUB routine used above
SELECT CASE KeyCode
CASE %VK_LEFT
LastKey = "LEFT ARROW"
CASE %VK_RIGHT
LastKey = "RIGHT ARROW"
CASE %VK_DOWN
LastKey = "DOWN ARROW"
CASE %VK_UP
LastKey = "UP ARROW"
CASE %VK_HOME
LastKey = "HOME"
CASE %VK_END
LastKey = "END"
CASE %VK_INSERT
LastKey = "INSERT"
CASE %VK_DELETE
LastKey = "DELETE"
CASE %VK_PGUP
LastKey = "PGUP"
CASE %VK_PGDN
LastKey = "PGDN"
CASE %VK_TAB
LastKey = "TAB"
CASE %VK_RETURN
LastKey = "RETURN"
CASE %VK_BACK
LastKey = "BACKSPACE"
CASE %VK_ESCAPE
LastKey = "ESCAPE"
CASE %VK_F1
LastKey = "F1"
CASE %VK_F2
LastKey = "F2"
CASE %VK_F3
LastKey = "F3"
CASE %VK_F4
LastKey = "F4"
CASE %VK_F5
LastKey = "F5"
CASE %VK_F6
LastKey = "F6"
CASE %VK_F7
LastKey = "F7"
CASE %VK_F8
LastKey = "F8"
CASE %VK_F9
LastKey = "F9"
CASE %VK_F10
LastKey = "F10"
CASE %VK_F11
LastKey = "F11"
CASE %VK_F12
LastKey = "F12"
CASE %VK_PRINT
LastKey = "PRINT SCREEN"
CASE %VK_SCROLL
LastKey = "SCROLL LOCK"
CASE %VK_PAUSE
LastKey = "PAUSE BREAK"
CASE 63, 111
' ? or o produced by numeric keypad
LastKey = CHR$(47) ' /
CASE 58, 106
' : or j produced by numeric keypad
LastKey = CHR$(42) ' *
CASE 61, 109
' = or m produced by numeric keypad
LastKey = CHR$(45) ' -
CASE 59, 107
' ; or k produced by numeric keypad
LastKey = CHR$(43) ' +
CASE 110
' n produced by numeric keypad
LastKey = CHR$(46) ' .
CASE 96 TO 105
' produced by numeric keypad
IF GetKeyState(%VK_NUMLOCK) THEN
KeyCode = KeyCode - 48
' 0 through 9
END IF
LastKey = CHR$(KeyCode)
CASE 32
LastKey = "SPACE"
CASE 48 TO 57
' 0 through 9
IF ISTRUE(LOWRD(GetKeyState(%VK_SHIFT)) AND &H8000) THEN
SELECT CASE KeyCode
CASE 48
LastKey = CHR$(41) ' )
CASE 49
LastKey = CHR$(33) ' !
CASE 50
LastKey = CHR$(64) ' @
CASE 51
LastKey = CHR$(35) ' #
CASE 52
LastKey = CHR$(36) ' $
CASE 53
LastKey = CHR$(37) ' %
CASE 54
LastKey = CHR$(94) ' ^
CASE 55
LastKey = CHR$(38) ' &
CASE 56
LastKey = CHR$(42) ' *
CASE 57
LastKey = CHR$(40) ' (
END SELECT
ELSE
LastKey = CHR$(KeyCode)
END IF
CASE 65 TO 90
' A through Z
IF ISTRUE(LOWRD(GetKeyState(%VK_SHIFT)) AND &H8000) OR GetKeyState(%VK_CAPITAL) THEN
KeyStroke = ""
ELSE
' a through z
KeyCode = KeyCode + 32
END IF
LastKey = CHR$(KeyCode)
CASE 186
IF ISTRUE(LOWRD(GetKeyState(%VK_SHIFT)) AND &H8000) THEN
LastKey = CHR$(58) ' :
ELSE
LastKey = CHR$(59) ' ;
END IF
CASE 187
IF ISTRUE(LOWRD(GetKeyState(%VK_SHIFT)) AND &H8000) THEN
LastKey = CHR$(43) ' +
ELSE
LastKey = CHR$(61) ' =
END IF
CASE 188
IF ISTRUE(LOWRD(GetKeyState(%VK_SHIFT)) AND &H8000) THEN
LastKey = CHR$(60) ' <
ELSE
LastKey = CHR$(44) ' .
END IF
CASE 189
IF ISTRUE(LOWRD(GetKeyState(%VK_SHIFT)) AND &H8000) THEN
LastKey = CHR$(95) ' _
ELSE
LastKey = CHR$(45) ' -
END IF
CASE 190
IF ISTRUE(LOWRD(GetKeyState(%VK_SHIFT)) AND &H8000) THEN
LastKey = CHR$(62) ' >
ELSE
LastKey = CHR$(46) ' ,
END IF
CASE 191
IF ISTRUE(LOWRD(GetKeyState(%VK_SHIFT)) AND &H8000) THEN
LastKey = CHR$(63) ' ?
ELSE
LastKey = CHR$(47) ' /
END IF
CASE 192
IF ISTRUE(LOWRD(GetKeyState(%VK_SHIFT)) AND &H8000) THEN
LastKey = CHR$(126) ' ~
ELSE
LastKey = CHR$(96) ' `
END IF
CASE 219
IF ISTRUE(LOWRD(GetKeyState(%VK_SHIFT)) AND &H8000) THEN
LastKey = CHR$(123) ' {
ELSE
LastKey = CHR$(91) ' [
END IF
CASE 220
IF ISTRUE(LOWRD(GetKeyState(%VK_SHIFT)) AND &H8000) THEN
LastKey = CHR$(124) ' |
ELSE
LastKey = CHR$(92) ' \
END IF
CASE 221
IF ISTRUE(LOWRD(GetKeyState(%VK_SHIFT)) AND &H8000) THEN
LastKey = CHR$(125) ' }
ELSE
LastKey = CHR$(93) ' ]
END IF
CASE 222
IF ISTRUE(LOWRD(GetKeyState(%VK_SHIFT)) AND &H8000) THEN
LastKey = CHR$(34) ' "
ELSE
LastKey = CHR$(39) ' '
END IF
CASE 20, 144, 12
' CapsLock, NumLock and the "5" on keypad w/numlock off
' Ignore these
LastKey = ""
CASE 91, 92, 93
' Windows and Windows Menu keys
' Ignore these
LastKey = ""
CASE ELSE
' Unknown
LastKey = ""
END SELECT
RETURN
END SUB