Read all characters of a keyboard

Just starting out? Need help? Post your questions and find answers here.
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5342
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Read all characters of a keyboard

Post by Kwai chang caine »

Hello at all

If i use a loop 0/255 value of the #Vk_Constant (CTRL/ALT/SHIFT/ALTGR/WIN pressed or not) with the SendInput_() API, am i sure i obtain all the characters a machine can write ?
Or i need use the list of all the scancode of the keyboard ?

Have a good day
ImageThe happiness is a road...
Not a destination
infratec
Always Here
Always Here
Posts: 6817
Joined: Sun Sep 07, 2008 12:45 pm
Location: Germany

Re: Read all characters of a keyboard

Post by infratec »

Code: Select all

;
; https://learn.microsoft.com/en-us/windows/win32/inputdev/virtual-key-codes
;

EnableExplicit

Enumeration
  #DisableGadget
  #ListIconGadget
EndEnumeration


Define.i Event, Exit, i
Dim KeyArray.a(255)

OpenWindow(#ListIconGadget, 0, 0, 400, 600, "KeyboardState", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
CheckBoxGadget(#DisableGadget, 10, 10, 100, 20, "Stop scrolling")
ListIconGadget(#ListIconGadget, 10, 40, 380, 550, "Index", 50, #PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
AddGadgetColumn(#ListIconGadget, 1, "Name", 200)
AddGadgetColumn(#ListIconGadget, 2, "Value", 50)
AddGadgetColumn(#ListIconGadget, 3, "State", 50)
For i = 0 To 255
  AddGadgetItem(#ListIconGadget, i, Str(i))
Next i

SetGadgetItemText(#ListIconGadget, $01, "VK_LBUTTON", 1)      ; Left mouse button
SetGadgetItemText(#ListIconGadget, $02, "VK_RBUTTON", 1)      ; Right mouse button
SetGadgetItemText(#ListIconGadget, $03, "VK_CANCEL", 1)       ; Control-Break processing
SetGadgetItemText(#ListIconGadget, $04, "VK_MBUTTON", 1)      ; Middle mouse button (three-button mouse)
SetGadgetItemText(#ListIconGadget, $05, "VK_XBUTTON1", 1)     ; X1 mouse button
SetGadgetItemText(#ListIconGadget, $06, "VK_XBUTTON2", 1)     ; X2 mouse button
; 07 Undefined
SetGadgetItemText(#ListIconGadget, $08, "VK_BACK", 1)         ; BACKSPACE key
SetGadgetItemText(#ListIconGadget, $09, "VK_TAB", 1)          ; TAB key
; 0A-0B Reserved
SetGadgetItemText(#ListIconGadget, $0C, "VK_CLEAR", 1)        ; CLEAR key
SetGadgetItemText(#ListIconGadget, $0D, "VK_RETURN", 1)       ; ENTER key
; 0E-0F Undefined
SetGadgetItemText(#ListIconGadget, $10, "VK_SHIFT", 1)        ; SHIFT key
SetGadgetItemText(#ListIconGadget, $11, "VK_CONTROL", 1)      ; CTRL key
SetGadgetItemText(#ListIconGadget, $12, "VK_MENU", 1)         ; ALT key
SetGadgetItemText(#ListIconGadget, $13, "VK_PAUSE", 1)        ; PAUSE key
SetGadgetItemText(#ListIconGadget, $14, "VK_CAPITAL", 1)      ; CAPS LOCK key
SetGadgetItemText(#ListIconGadget, $15, "VK_KANA_HANGUEL_HANGUL", 1) ; IME Kana mode
SetGadgetItemText(#ListIconGadget, $16, "VK_IME_ON", 1)       ; IME On
SetGadgetItemText(#ListIconGadget, $17, "VK_JUNJA", 1)        ; IME Junja mode
SetGadgetItemText(#ListIconGadget, $18, "VK_FINAL", 1)        ; IME final mode
SetGadgetItemText(#ListIconGadget, $19, "VK_HANJA_KANJI", 1)  ; IME Hanja mode
SetGadgetItemText(#ListIconGadget, $1A, "VK_IME_OFF", 1)      ; IME Off
SetGadgetItemText(#ListIconGadget, $1B, "VK_ESCAPE", 1)       ; ESC key
SetGadgetItemText(#ListIconGadget, $1C, "VK_CONVERT", 1)      ; IME convert
SetGadgetItemText(#ListIconGadget, $1D, "VK_NONCONVERT", 1)   ; IME nonconvert
SetGadgetItemText(#ListIconGadget, $1E, "VK_ACCEPT", 1)       ; IME accept
SetGadgetItemText(#ListIconGadget, $1F, "VK_MODECHANGE", 1)   ; IME mode change request
SetGadgetItemText(#ListIconGadget, $20, "VK_SPACE", 1)        ; SPACEBAR
SetGadgetItemText(#ListIconGadget, $21, "VK_PRIOR", 1)        ; PAGE UP key
SetGadgetItemText(#ListIconGadget, $22, "VK_NEXT", 1)         ; PAGE DOWN key
SetGadgetItemText(#ListIconGadget, $23, "VK_END", 1)          ; End key
SetGadgetItemText(#ListIconGadget, $24, "VK_HOME", 1)         ; HOME key
SetGadgetItemText(#ListIconGadget, $25, "VK_LEFT", 1)         ; LEFT ARROW key
SetGadgetItemText(#ListIconGadget, $26, "VK_UP", 1)           ; UP ARROW key
SetGadgetItemText(#ListIconGadget, $27, "VK_RIGHT", 1)        ; RIGHT ARROW key
SetGadgetItemText(#ListIconGadget, $28, "VK_DOWN", 1)         ; DOWN ARROW key
SetGadgetItemText(#ListIconGadget, $29, "VK_SELECT", 1)       ; Select key
SetGadgetItemText(#ListIconGadget, $2A, "VK_PRINT", 1)        ; PRINT key
SetGadgetItemText(#ListIconGadget, $2B, "VK_EXECUTE", 1)      ; EXECUTE key
SetGadgetItemText(#ListIconGadget, $2C, "VK_SNAPSHOT", 1)     ; PRINT SCREEN key
SetGadgetItemText(#ListIconGadget, $2D, "VK_INSERT", 1)       ; INS key
SetGadgetItemText(#ListIconGadget, $2E, "VK_DELETE", 1)       ; DEL key
SetGadgetItemText(#ListIconGadget, $2F, "VK_HELP", 1)         ; HELP key
SetGadgetItemText(#ListIconGadget, $30, "0 key", 1)
SetGadgetItemText(#ListIconGadget, $31, "1 key", 1)
SetGadgetItemText(#ListIconGadget, $32, "2 key", 1)
SetGadgetItemText(#ListIconGadget, $33, "3 key", 1)
SetGadgetItemText(#ListIconGadget, $34, "4 key", 1)
SetGadgetItemText(#ListIconGadget, $35, "5 key", 1)
SetGadgetItemText(#ListIconGadget, $36, "6 key", 1)
SetGadgetItemText(#ListIconGadget, $37, "7 key", 1)
SetGadgetItemText(#ListIconGadget, $38, "8 key", 1)
SetGadgetItemText(#ListIconGadget, $39, "9 key", 1)
; 3A-40, "Undefined
SetGadgetItemText(#ListIconGadget, $41, "A key", 1)
SetGadgetItemText(#ListIconGadget, $42, "B key", 1)
SetGadgetItemText(#ListIconGadget, $43, "C key", 1)
SetGadgetItemText(#ListIconGadget, $44, "D key", 1)
SetGadgetItemText(#ListIconGadget, $45, "E key", 1)
SetGadgetItemText(#ListIconGadget, $46, "F key", 1)
SetGadgetItemText(#ListIconGadget, $47, "G key", 1)
SetGadgetItemText(#ListIconGadget, $48, "H key", 1)
SetGadgetItemText(#ListIconGadget, $49, "I key", 1)
SetGadgetItemText(#ListIconGadget, $4A, "J key", 1)
SetGadgetItemText(#ListIconGadget, $4B, "K key", 1)
SetGadgetItemText(#ListIconGadget, $4C, "L key", 1)
SetGadgetItemText(#ListIconGadget, $4D, "M key", 1)
SetGadgetItemText(#ListIconGadget, $4E, "N key", 1)
SetGadgetItemText(#ListIconGadget, $4F, "O key", 1)
SetGadgetItemText(#ListIconGadget, $50, "P key", 1)
SetGadgetItemText(#ListIconGadget, $51, "Q key", 1)
SetGadgetItemText(#ListIconGadget, $52, "R key", 1)
SetGadgetItemText(#ListIconGadget, $53, "S key", 1)
SetGadgetItemText(#ListIconGadget, $54, "T key", 1)
SetGadgetItemText(#ListIconGadget, $55, "U key", 1)
SetGadgetItemText(#ListIconGadget, $56, "V key", 1)
SetGadgetItemText(#ListIconGadget, $57, "W key", 1)
SetGadgetItemText(#ListIconGadget, $58, "X key", 1)
SetGadgetItemText(#ListIconGadget, $59, "Y key", 1)
SetGadgetItemText(#ListIconGadget, $5A, "Z key", 1)
SetGadgetItemText(#ListIconGadget, $5B, "VK_LWIN", 1)         ; Left Windows key (Natural keyboard)
SetGadgetItemText(#ListIconGadget, $5C, "VK_RWIN", 1)         ; Right Windows key (Natural keyboard)
SetGadgetItemText(#ListIconGadget, $5D, "VK_APPS", 1)         ; Applications key (Natural keyboard)
; 5E, "Reserved
SetGadgetItemText(#ListIconGadget, $5F, "VK_SLEEP", 1)        ; Computer Sleep key
SetGadgetItemText(#ListIconGadget, $60, "VK_NUMPAD0", 1)      ; Numeric keypad 0 key
SetGadgetItemText(#ListIconGadget, $61, "VK_NUMPAD1", 1)      ; Numeric keypad 1 key
SetGadgetItemText(#ListIconGadget, $62, "VK_NUMPAD2", 1)      ; Numeric keypad 2 key
SetGadgetItemText(#ListIconGadget, $63, "VK_NUMPAD3", 1)      ; Numeric keypad 3 key
SetGadgetItemText(#ListIconGadget, $64, "VK_NUMPAD4", 1)      ; Numeric keypad 4 key
SetGadgetItemText(#ListIconGadget, $65, "VK_NUMPAD5", 1)      ; Numeric keypad 5 key
SetGadgetItemText(#ListIconGadget, $66, "VK_NUMPAD6", 1)      ; Numeric keypad 6 key
SetGadgetItemText(#ListIconGadget, $67, "VK_NUMPAD7", 1)      ; Numeric keypad 7 key
SetGadgetItemText(#ListIconGadget, $68, "VK_NUMPAD8", 1)      ; Numeric keypad 8 key
SetGadgetItemText(#ListIconGadget, $69, "VK_NUMPAD9", 1)      ; Numeric keypad 9 key
SetGadgetItemText(#ListIconGadget, $6A, "VK_MULTIPLY", 1)     ; Multiply key
SetGadgetItemText(#ListIconGadget, $6B, "VK_ADD", 1)          ; Add key
SetGadgetItemText(#ListIconGadget, $6C, "VK_SEPARATOR", 1)    ; Separator key
SetGadgetItemText(#ListIconGadget, $6D, "VK_SUBTRACT", 1)     ; Subtract key
SetGadgetItemText(#ListIconGadget, $6E, "VK_DECIMAL", 1)      ; Decimal key
SetGadgetItemText(#ListIconGadget, $6F, "VK_DIVIDE", 1)       ; Divide key
SetGadgetItemText(#ListIconGadget, $70, "VK_F1", 1)           ; F1 key
SetGadgetItemText(#ListIconGadget, $71, "VK_F2", 1)           ; F2 key
SetGadgetItemText(#ListIconGadget, $72, "VK_F3", 1)           ; F3 key
SetGadgetItemText(#ListIconGadget, $73, "VK_F4", 1)           ; F4 key
SetGadgetItemText(#ListIconGadget, $74, "VK_F5", 1)           ; F5 key
SetGadgetItemText(#ListIconGadget, $75, "VK_F6", 1)           ; F6 key
SetGadgetItemText(#ListIconGadget, $76, "VK_F7", 1)           ; F7 key
SetGadgetItemText(#ListIconGadget, $77, "VK_F8", 1)           ; F8 key
SetGadgetItemText(#ListIconGadget, $78, "VK_F9", 1)           ; F9 key
SetGadgetItemText(#ListIconGadget, $79, "VK_F10", 1)          ; F10 key
SetGadgetItemText(#ListIconGadget, $7A, "VK_F11", 1)          ; F11 key
SetGadgetItemText(#ListIconGadget, $7B, "VK_F12", 1)          ; F12 key
SetGadgetItemText(#ListIconGadget, $7C, "VK_F13", 1)          ; F13 key
SetGadgetItemText(#ListIconGadget, $7D, "VK_F14", 1)          ; F14 key
SetGadgetItemText(#ListIconGadget, $7E, "VK_F15", 1)          ; F15 key
SetGadgetItemText(#ListIconGadget, $7F, "VK_F16", 1)          ; F16 key
SetGadgetItemText(#ListIconGadget, $80, "VK_F17", 1)          ; F17 key
SetGadgetItemText(#ListIconGadget, $81, "VK_F18", 1)          ; F18 key
SetGadgetItemText(#ListIconGadget, $82, "VK_F19", 1)          ; F19 key
SetGadgetItemText(#ListIconGadget, $83, "VK_F20", 1)          ; F20 key
SetGadgetItemText(#ListIconGadget, $84, "VK_F21", 1)          ; F21 key
SetGadgetItemText(#ListIconGadget, $85, "VK_F22", 1)          ; F22 key
SetGadgetItemText(#ListIconGadget, $86, "VK_F23", 1)          ; F23 key
SetGadgetItemText(#ListIconGadget, $87, "VK_F24", 1)          ; F24 key
; 88-8F, "Unassigned
SetGadgetItemText(#ListIconGadget, $90, "VK_NUMLOCK", 1)      ; NUM LOCK key
SetGadgetItemText(#ListIconGadget, $91, "VK_SCROLL", 1)       ; SCROLL LOCK key
; 92-96, "OEM specific
; 97-9F, "Unassigned
SetGadgetItemText(#ListIconGadget, $A0, "VK_LSHIFT", 1)       ; Left SHIFT key
SetGadgetItemText(#ListIconGadget, $A1, "VK_RSHIFT", 1)       ; Right SHIFT key
SetGadgetItemText(#ListIconGadget, $A2, "VK_LCONTROL", 1)     ; Left CONTROL key
SetGadgetItemText(#ListIconGadget, $A3, "VK_RCONTROL", 1)     ; Right CONTROL key
SetGadgetItemText(#ListIconGadget, $A4, "VK_LMENU", 1)        ; Left ALT key
SetGadgetItemText(#ListIconGadget, $A5, "VK_RMENU", 1)        ; Right ALT key
SetGadgetItemText(#ListIconGadget, $A6, "VK_BROWSER_BACK", 1) ; Browser Back key
SetGadgetItemText(#ListIconGadget, $A7, "VK_BROWSER_FORWARD", 1) ; Browser Forward key
SetGadgetItemText(#ListIconGadget, $A8, "VK_BROWSER_REFRESH", 1) ; Browser Refresh key
SetGadgetItemText(#ListIconGadget, $A9, "VK_BROWSER_STOP", 1) ; Browser Stop key
SetGadgetItemText(#ListIconGadget, $AA, "VK_BROWSER_SEARCH", 1) ; Browser Search key
SetGadgetItemText(#ListIconGadget, $AB, "VK_BROWSER_FAVORITES", 1) ; Browser Favorites key
SetGadgetItemText(#ListIconGadget, $AC, "VK_BROWSER_HOME", 1) ; Browser Start And Home key
SetGadgetItemText(#ListIconGadget, $AD, "VK_VOLUME_MUTE", 1)  ; Volume Mute key
SetGadgetItemText(#ListIconGadget, $AE, "VK_VOLUME_DOWN", 1)  ; Volume Down key
SetGadgetItemText(#ListIconGadget, $AF, "VK_VOLUME_UP", 1)    ; Volume Up key
SetGadgetItemText(#ListIconGadget, $B0, "VK_MEDIA_NEXT_TRACK", 1) ; Next Track key
SetGadgetItemText(#ListIconGadget, $B1, "VK_MEDIA_PREV_TRACK", 1) ; Previous Track key
SetGadgetItemText(#ListIconGadget, $B2, "VK_MEDIA_STOP", 1)   ; Stop Media key
SetGadgetItemText(#ListIconGadget, $B3, "VK_MEDIA_PLAY_PAUSE", 1) ; Play/Pause Media key
SetGadgetItemText(#ListIconGadget, $B4, "VK_LAUNCH_MAIL", 1)  ; Start Mail key
SetGadgetItemText(#ListIconGadget, $B5, "VK_LAUNCH_MEDIA_SELECT", 1) ; Select Media key
SetGadgetItemText(#ListIconGadget, $B6, "VK_LAUNCH_APP1", 1)  ; Start Application 1 key
SetGadgetItemText(#ListIconGadget, $B7, "VK_LAUNCH_APP2", 1)  ; Start Application 2 key
; B8-B9, "Reserved
SetGadgetItemText(#ListIconGadget, $BA, "VK_OEM_1", 1)        ; Used For miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the ';:' key
SetGadgetItemText(#ListIconGadget, $BB, "VK_OEM_PLUS", 1)     ; For any country/region, the '+' key
SetGadgetItemText(#ListIconGadget, $BC, "VK_OEM_COMMA", 1)    ; For any country/region, the ',' key
SetGadgetItemText(#ListIconGadget, $BD, "VK_OEM_MINUS", 1)    ; For any country/region, the '-' key
SetGadgetItemText(#ListIconGadget, $BE, "VK_OEM_PERIOD", 1)   ; For any country/region, the '.' key
SetGadgetItemText(#ListIconGadget, $BF, "VK_OEM_2", 1)        ; Used For miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '/?' key
SetGadgetItemText(#ListIconGadget, $C0, "VK_OEM_3", 1)        ; Used For miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '`~' key
; C1-D7, "Reserved
; D8-DA, "Unassigned
SetGadgetItemText(#ListIconGadget, $DB, "VK_OEM_4", 1)        ; Used For miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '[{' key
SetGadgetItemText(#ListIconGadget, $DC, "VK_OEM_5", 1)        ; Used For miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the '\|' key
SetGadgetItemText(#ListIconGadget, $DD, "VK_OEM_6", 1)        ; Used For miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the ']}' key
SetGadgetItemText(#ListIconGadget, $DE, "VK_OEM_7", 1)        ; Used For miscellaneous characters; it can vary by keyboard. For the US standard keyboard, the 'single-quote/double-quote' key
SetGadgetItemText(#ListIconGadget, $DF, "VK_OEM_8", 1)        ; Used For miscellaneous characters; it can vary by keyboard.
; E0, "Reserved
;	E1, "OEM specific
SetGadgetItemText(#ListIconGadget, $E2, "VK_OEM_102", 1)      ; The <> keys on the US standard keyboard, Or the \\| key on the non-US 102-key keyboard
;	E3-E4, "OEM specific
SetGadgetItemText(#ListIconGadget, $E5, "VK_PROCESSKEY", 1)   ; IME PROCESS key
; E6, "OEM specific
SetGadgetItemText(#ListIconGadget, $E7, "VK_PACKET", 1)       ; Used To pass Unicode characters As If they were keystrokes. The SetGadgetItemText(#ListIconGadget, 1, "VK_PACKET key is the low word of a 32-bit Virtual key value used For non-keyboard input methods. For more information, see Remark in keyBDINPUT, SendInput, WM_KEYDOWN, And WM_KEYUP
; E8, "Unassigned
;	E9-F5, "OEM specific
SetGadgetItemText(#ListIconGadget, $F6, "VK_ATTN", 1)         ; Attn key
SetGadgetItemText(#ListIconGadget, $F7, "VK_CRSEL", 1)        ; CrSel key
SetGadgetItemText(#ListIconGadget, $F8, "VK_EXSEL", 1)        ; ExSel key
SetGadgetItemText(#ListIconGadget, $F9, "VK_EREOF", 1)        ; Erase EOF key
SetGadgetItemText(#ListIconGadget, $FA, "VK_PLAY", 1)         ; Play key
SetGadgetItemText(#ListIconGadget, $FB, "VK_ZOOM", 1)         ; Zoom key
SetGadgetItemText(#ListIconGadget, $FC, "VK_NONAME", 1)       ; Reserved
SetGadgetItemText(#ListIconGadget, $FD, "VK_PA1", 1)          ; PA1 key
SetGadgetItemText(#ListIconGadget, $FE, "VK_OEM_CLEAR", 1)    ; Clear key


Repeat
  Event = WindowEvent()
  While Event
    Select Event
      Case #PB_Event_CloseWindow
        Exit = #True
        
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #DisableGadget
            DisableGadget(#ListIconGadget, GetGadgetState(#DisableGadget))
            SetActiveGadget(-1)
        EndSelect
    EndSelect
    Event = WindowEvent()
  Wend
  GetKeyboardState_(@KeyArray(0))
  For i = 0 To 255
    SetGadgetItemText(#ListIconGadget, i, Str(KeyArray(i)), 2)
    If KeyArray(i) & %10000000
      SetGadgetItemText(#ListIconGadget, i, "down", 3)
    Else
      SetGadgetItemText(#ListIconGadget, i, "up", 3)
    EndIf
  Next i
  Delay(50)
Until Exit
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4635
Joined: Sun Apr 12, 2009 6:27 am

Re: Read all characters of a keyboard

Post by RASHAD »

Hi KCC
I am not sure about what you are after
Next just an add to infratec snippet
Hope you are satisfied for now

Code: Select all

Global Hook, Dim Key.s(256)
 
Procedure KeyboardHook(nCode, wParam,lParam)
  *k.KBDLLHOOKSTRUCT = lParam
  If nCode < 0 
    ProcedureReturn CallNextHookEx_(hook, nCode, wParam,lParam)
  EndIf
  If wParam=#WM_KEYDOWN Or wParam=#WM_SYSKEYDOWN Or wParam=#WM_DEADCHAR  Or wParam=#WM_SYSCHAR
    Select *k\vkCode
      Case 8
        Debug "Back Space"
        CtrlChar = 1
      Case 9
        Debug "TAB"
      Case 13
        Debug "ENTER"        
      Case 19
        Debug "PAUSE"
      Case 27
        Debug "ESC"
        CtrlChar = 1
      Case 33
        Debug "PgUp"
      Case 34
        Debug "PgDn"
      Case 35
        Debug "END"
      Case 36
        Debug "HOME"
      Case 36
        Debug "Left Arrow"
      Case 37
        Debug "Left Arrow"
      Case 39
        Debug "Right Arrow" 
      Case 38
        Debug "Up Arrow"
      Case 40
        Debug "Down Arrow"
      Case 44
        Debug "SCREENSHOT"
      Case 45
        Debug "INS"
      Case 46
        Debug "DEL"
      Case 91
        Debug "Window"
      Case 93
        Debug "Menu"
      Case 112 To 123
        Debug "F"+Str(*k\vkCode-111)
      Case 144
        Debug "NumLk"
      Case 162
        Debug "Left Ctrl"
      Case 163
        Debug "Right Ctrl"
      Case 164
        Debug "Alt"
      Case 165
        Debug "Alt Graph"   
    EndSelect
    GetKeyboardState_(@Key())
    ToAscii_(*k\vkCode,*k\scanCode, @Key(), @Ascii.w,0)         
    If Ascii = 0 Or CtrlChar = 1
      CtrlChar = 0
      ProcedureReturn CallNextHookEx_(hook, nCode, wParam,lParam)
    Else
      Debug Chr(Ascii)
    EndIf 
  EndIf
  ProcedureReturn CallNextHookEx_(hook, nCode, wParam,lParam)
EndProcedure

OpenWindow(0, 0, 0, 400,300, "Keyboard Hook", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
hook=SetWindowsHookEx_(#WH_KEYBOARD_LL, @KeyboardHook(), GetModuleHandle_(0), 0)

Repeat
  Select WaitWindowEvent()      
    Case #PB_Event_CloseWindow
      Quit = 1
         
  EndSelect
      
Until Quit = 1
UnhookWindowsHookEx_(hook)
End

Egypt my love
User avatar
Kwai chang caine
Always Here
Always Here
Posts: 5342
Joined: Sun Nov 05, 2006 11:42 pm
Location: Lyon - France

Re: Read all characters of a keyboard

Post by Kwai chang caine »

@INFRATEC
Thanks INFRATEC for your nice and very useful code, i keep it for a future tool i want to create in the future 8)

But i have try this time to not too much chaffe the eyes of the friends of forum, trying to do like everybody, ask my question in 1 or 2 lines only (This is an exploit for KCC :mrgreen:)
But apparently, short question, is again worst than a long to make me understand :lol:

On my chinese machine the keys are not on the same place than a normal keyboard, because it is too small :|
Furthermore, some keys are even deleted, like ALTGR for example :shock:
And there are also the FN key who adding numerous characters....

Brief...i say to me, if it's possible to ask at the keyboard to press each key in normal, after with CTRL, with ALT, SHIFT, FN, etc ...
In one world, all it's possible to write with the keyboard
Like this i can see some characters hidden because what is incised on the keys, not are the real character writting when i press it
Like that, i can know on what keys it is, with all informations (Character (if exist) ScanCode, VkCode, state, etc ...) :idea:

Is it the case with your code ? all it's possible is showing ? or it show the state of the keyboard for see if a key is pressed or not ?

@RASHAD
Thanks to, for your add to the INFRATEC code 8)
You will not be too much of two masters, to manage to find the codes which correspond to the stupid ideas which germinate in the sick and impotent brain of KCC :mrgreen: :lol:
ImageThe happiness is a road...
Not a destination
novablue
Enthusiast
Enthusiast
Posts: 165
Joined: Sun Nov 27, 2016 6:38 am

Re: Read all characters of a keyboard

Post by novablue »

RASHAD wrote: Sun Jan 29, 2023 5:14 pm Hi KCC
I am not sure about what you are after
Next just an add to infratec snippet
Hope you are satisfied for now

Code: Select all

Global Hook, Dim Key.s(256)
 
Procedure KeyboardHook(nCode, wParam,lParam)
  *k.KBDLLHOOKSTRUCT = lParam
  If nCode < 0 
    ProcedureReturn CallNextHookEx_(hook, nCode, wParam,lParam)
  EndIf
  If wParam=#WM_KEYDOWN Or wParam=#WM_SYSKEYDOWN Or wParam=#WM_DEADCHAR  Or wParam=#WM_SYSCHAR
    Select *k\vkCode
      Case 8
        Debug "Back Space"
        CtrlChar = 1
      Case 9
        Debug "TAB"
      Case 13
        Debug "ENTER"        
      Case 19
        Debug "PAUSE"
      Case 27
        Debug "ESC"
        CtrlChar = 1
      Case 33
        Debug "PgUp"
      Case 34
        Debug "PgDn"
      Case 35
        Debug "END"
      Case 36
        Debug "HOME"
      Case 36
        Debug "Left Arrow"
      Case 37
        Debug "Left Arrow"
      Case 39
        Debug "Right Arrow" 
      Case 38
        Debug "Up Arrow"
      Case 40
        Debug "Down Arrow"
      Case 44
        Debug "SCREENSHOT"
      Case 45
        Debug "INS"
      Case 46
        Debug "DEL"
      Case 91
        Debug "Window"
      Case 93
        Debug "Menu"
      Case 112 To 123
        Debug "F"+Str(*k\vkCode-111)
      Case 144
        Debug "NumLk"
      Case 162
        Debug "Left Ctrl"
      Case 163
        Debug "Right Ctrl"
      Case 164
        Debug "Alt"
      Case 165
        Debug "Alt Graph"   
    EndSelect
    GetKeyboardState_(@Key())
    ToAscii_(*k\vkCode,*k\scanCode, @Key(), @Ascii.w,0)         
    If Ascii = 0 Or CtrlChar = 1
      CtrlChar = 0
      ProcedureReturn CallNextHookEx_(hook, nCode, wParam,lParam)
    Else
      Debug Chr(Ascii)
    EndIf 
  EndIf
  ProcedureReturn CallNextHookEx_(hook, nCode, wParam,lParam)
EndProcedure

OpenWindow(0, 0, 0, 400,300, "Keyboard Hook", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
hook=SetWindowsHookEx_(#WH_KEYBOARD_LL, @KeyboardHook(), GetModuleHandle_(0), 0)

Repeat
  Select WaitWindowEvent()      
    Case #PB_Event_CloseWindow
      Quit = 1
         
  EndSelect
      
Until Quit = 1
UnhookWindowsHookEx_(hook)
End

I am looking for a solution to reliably figure out if for example "?" is pressed on a keyboard, no matter if its a German, Italian or English keyboard etc. This code seems to be doing the trick but as soon as i unfocus the window and type into for example notepad it does not recognize special characters like "?" anymore.

On a German keyboard for example its "SHIFT + ß" Key to get "?" and this code works and displays "?" but inside notepad it will just display "ß" as input, how can i fix that?
RASHAD
PureBasic Expert
PureBasic Expert
Posts: 4635
Joined: Sun Apr 12, 2009 6:27 am

Re: Read all characters of a keyboard

Post by RASHAD »

Hi novablue
You need to read the Unicode character
Here it's
I hope it's what you asked for

Code: Select all


Global Hook, Dim Key.s(256),Dim txt.s(10)

Procedure KeyboardHook(nCode, wParam,lParam)
  *k.KBDLLHOOKSTRUCT = lParam
  If nCode < 0 
    ProcedureReturn CallNextHookEx_(hook, nCode, wParam,lParam)
  EndIf
  If wParam = #WM_KEYDOWN
    GetKeyState_(#VK_SHIFT)
    GetKeyState_(#VK_CONTROL)
    GetKeyState_(#VK_MENU)
    GetKeyboardState_(@Key())
    ToUnicode_(*k\vkCode,*k\scanCode, @Key(), @txt, SizeOf(txt)/SizeOf(character) - 1,0)
    If txt = 0
      ProcedureReturn CallNextHookEx_(hook, nCode, wParam,lParam)
    Else
      Debug txt
      Debug Chr(txt)
    EndIf
  EndIf
  ProcedureReturn CallNextHookEx_(hook, nCode, wParam,lParam)
EndProcedure

OpenWindow(0, 0, 0, 400,300, "Keyboard Hook", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
hook=SetWindowsHookEx_(#WH_KEYBOARD_LL, @KeyboardHook(), GetModuleHandle_(0), 0)

Repeat
  Select WaitWindowEvent()      
    Case #PB_Event_CloseWindow
      Quit = 1
         
  EndSelect
      
Until Quit = 1
UnhookWindowsHookEx_(hook)
End
Egypt my love
novablue
Enthusiast
Enthusiast
Posts: 165
Joined: Sun Nov 27, 2016 6:38 am

Re: Read all characters of a keyboard

Post by novablue »

It is working great, thanks! :D
BarryG
Addict
Addict
Posts: 3292
Joined: Thu Apr 18, 2019 8:17 am

Re: Read all characters of a keyboard

Post by BarryG »

Just be aware that using a keyboard hook will get your app flagged as malware by anti-virus apps. Happens to me all the time.

Here's what VirusTotal says about my main app, and why my app is "dangerous":

Image
novablue
Enthusiast
Enthusiast
Posts: 165
Joined: Sun Nov 27, 2016 6:38 am

Re: Read all characters of a keyboard

Post by novablue »

BarryG wrote: Sun May 14, 2023 12:34 am Just be aware that using a keyboard hook will get your app flagged as malware by anti-virus apps. Happens to me all the time.

Here's what VirusTotal says about my main app, and why my app is "dangerous":

Image
Yes that's a general problem these days with most av software. I accepted a long time ago that almost all my apps get randomly flagged no matter what they do.
Post Reply