Announcement

Collapse
No announcement yet.

Raw Keyboard (HID) Input (discussion)

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    #21
    > ...there is no difference between Capital U key entry and small letter u...

    This is normal at this "low level". Lowercase and uppercase are determined via other keys states. Does CapsLock is on or does SHIFT is down while hitting the letter key, etc.

    You can do something similar to this
    STATIC ShiftDown AS LONG
    IF SHIFT + WM-KEYDOWN THEN ShiftDown = %TRUE
    IF SHIFT + WM-KEYUP THEN ShiftDown = %FALSE
    IF ShiftDown THEN TypedLetter = "U" ELSE TypedLetter = "u" 'Upppercase/lowercase
    IF CapsLock = %TRUE THEN... etc,

    Comment


      #22
      I do not follow all this!!!

      Can I write a program in PBCC which when I run it, it means that my caps lock key will no longer work?
      [I]I made a coding error once - but fortunately I fixed it before anyone noticed[/I]
      Kerry Farmer

      Comment


        #23
        Hi Kerry, this prog can only do keyboard entries detection that is it will capture and display what key stroke that you hit on the keyboard.
        It does not set the key state such as Caps Lock.

        Thanks Pierre, that means I must record down the keystrokes at least 3 previous keystrokes before the current one
        in order to know whether the current key is uppercase or lowercase. Probably I use a flag to indicate the state whenever

        IF CapsLock = %TRUE THEN
        ' caps on
        flgCaps = 1
        END IF

        Comment


          #24
          Kerry> Can I write a program in PBCC which when I run it, it means that my caps lock key will no longer work?

          In case you want to do something like that, a LowLevel Keyboard Hook may work for you...
          Code:
          #COMPILE EXE '#CC 6.04#
          #BREAK ON
          %UNICODE = 1
          #INCLUDE "Win32Api.inc"
          OPTION EXPLICIT
          
          GLOBAL ghKeyboardHook AS DWORD
          '_____________________________________________________________________________
          
          FUNCTION LowLevelKeyboardHookProc(BYVAL nCode AS LONG, BYVAL wParam AS LONG, BYVAL pKbData AS KBDLLHOOKSTRUCT POINTER)AS LONG
          
           IF nCode = %HC_ACTION THEN
             SELECT CASE wParam
               CASE %WM_KEYDOWN, %WM_KEYUP
                 IF @pKbData.vkCode = %VK_CAPITAL THEN
                   FUNCTION = %TRUE
                   EXIT FUNCTION
                 END IF
             END SELECT
           END IF
           CallNextHookEx(ghKeyboardHook, nCode, wParam, pKbData)
          
          END FUNCTION
          '_____________________________________________________________________________
          
          FUNCTION PBMAIN()
           DIM KeyStateArray(256) AS BYTE
          
           GetKeyboardState(BYVAL VARPTR(keyStateArray(0)))
          
           'Force CapsLockOn
           'IF KeyStateArray(%VK_CAPITAL) = %FALSE THEN
           '  Keybd_event(%VK_CAPITAL, 0, %KEYEVENTF_EXTENDEDKEY, 0)
           '  Keybd_event(%VK_CAPITAL, 0, %KEYEVENTF_EXTENDEDKEY OR %KEYEVENTF_KEYUP, 0)
           'END IF
          
           'Force CapsLockOff
           IF KeyStateArray(%VK_CAPITAL) THEN
             Keybd_event(%VK_CAPITAL, 0, %KEYEVENTF_EXTENDEDKEY, 0)
             Keybd_event(%VK_CAPITAL, 0, %KEYEVENTF_EXTENDEDKEY OR %KEYEVENTF_KEYUP, 0)
             'Some keyboard driver release <CapLock> by the use of the <Shift> key.
             Keybd_event(%VK_SHIFT, 0, 0, 0)
             Keybd_event(%VK_SHIFT, 0, %KEYEVENTF_KEYUP, 0)
             PRINT "Turning CapsLock off..."
           ELSE
             PRINT "CapsLock was already off"
           END IF
          
           ghKeyboardHook = SetWindowsHookEx(%WH_KEYBOARD_LL, CODEPTR(LowLevelKeyboardHookProc), _
                                             GetModuleHandle(BYVAL 0), BYVAL %NULL)
          
          
           PRINT "CapsLock is disable via hook"
           INPUT FLUSH
           WAITKEY$
          
           UnhookWindowsHookEx(ghKeyboardHook)
          
          END FUNCTION
          '_____________________________________________________________________________
          '​​

          Comment


            #25
            Similar as above for PB/Win
            Code:
            #COMPILE EXE '#Win 10.04#
            %UNICODE = 1
            #INCLUDE "Win32Api.inc"
            OPTION EXPLICIT
            
            GLOBAL hDlg                AS DWORD
            GLOBAL ghKeyboardHook      AS DWORD
            GLOBAL gKeyboardHookBypass AS LONG
            
            %ButtonCapsLockOn  = 101
            %ButtonCapsLockOff = 202
            '_____________________________________________________________________________
            
            FUNCTION LowLevelKeyboardHookProc(BYVAL nCode AS LONG, BYVAL wParam AS LONG, BYVAL pKbData AS KBDLLHOOKSTRUCT POINTER)AS LONG
            
             IF nCode = %HC_ACTION THEN
               If gKeyboardHookBypass = %FALSE THEN
                 SELECT CASE wParam
                   CASE %WM_KEYDOWN, %WM_KEYUP
                     IF @pKbData.vkCode = %VK_CAPITAL THEN
                       FUNCTION = %TRUE
                       EXIT FUNCTION
                     END IF
                 END SELECT
               END IF
             END IF
             CallNextHookEx(ghKeyboardHook, nCode, wParam, pKbData)
            
            END FUNCTION
            '_____________________________________________________________________________
            
            CALLBACK FUNCTION DlgProc
            
             SELECT CASE CBMSG
            
               CASE %WM_INITDIALOG
                 ghKeyboardHook = SetWindowsHookEx(%WH_KEYBOARD_LL, CODEPTR(LowLevelKeyboardHookProc), _
                                                   GetModuleHandle(BYVAL 0), BYVAL %NULL)
            
               CASE %WM_COMMAND
                 SELECT CASE LOWRD(CBWPARAM)
                   CASE %ButtonCapsLockOn
                     IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                       gKeyboardHookBypass = %TRUE
                       Keybd_event(%VK_CAPITAL, 0, %KEYEVENTF_EXTENDEDKEY, 0)
                       Keybd_event(%VK_CAPITAL, 0, %KEYEVENTF_EXTENDEDKEY OR %KEYEVENTF_KEYUP, 0)
                       gKeyboardHookBypass = %FALSE
                     END IF
            
                   CASE %ButtonCapsLockOff
                     IF CBCTLMSG = %BN_CLICKED OR CBCTLMSG = 1 THEN
                       gKeyboardHookBypass = %TRUE
                       Keybd_event(%VK_CAPITAL, 0, %KEYEVENTF_EXTENDEDKEY, 0)
                       Keybd_event(%VK_CAPITAL, 0, %KEYEVENTF_EXTENDEDKEY OR %KEYEVENTF_KEYUP, 0)
                       'Some keyboard driver release <CapLock> by the use of the <Shift> key.
                       Keybd_event(%VK_SHIFT, 0, 0, 0)
                       Keybd_event(%VK_SHIFT, 0, %KEYEVENTF_KEYUP, 0)
                       gKeyboardHookBypass = %FALSE
                     END IF
                 END SELECT
            
               CASE %WM_DESTROY
                 UnhookWindowsHookEx(ghKeyboardHook)
            
              END SELECT
            
            END FUNCTION
            '_____________________________________________________________________________
            
            FUNCTION WINMAIN(BYVAL hCurrInstance AS LONG, _
                             BYVAL hPrevInstance AS LONG, _
                             BYVAL lpCmdLine     AS ASCIIZ POINTER, _
                             BYVAL nCmdShow      AS LONG)AS LONG
             LOCAL hIconBig   AS DWORD
             LOCAL hIconSmall AS DWORD
            
             DIALOG NEW %HWND_DESKTOP ,"CapsLock disable", , , 200, 50, _
             %WS_CAPTION OR %WS_MINIMIZEBOX OR %WS_SYSMENU, 0 TO hDlg '%WS_EX_TOPMOST
            
             ExtractIconEx("msctf.dll", 15, BYVAL VARPTR(hIconBig), BYVAL VARPTR(hIconSmall), 1)
             SetClassLong(hDlg, %GCL_HICONSM, hIconSmall)
             SetClassLong(hDlg, %GCL_HICON, hIconBig)
             SendMessage(hDlg, %WM_SETICON, %ICON_SMALL, hIconSmall)
             SendMessage(hDlg, %WM_SETICON, %ICON_BIG, hIconBig)
            
             CONTROL ADD BUTTON,  hDlg, %ButtonCapsLockOn,  "CapsLock on",  25,  15, 50, 15
             CONTROL ADD BUTTON,  hDlg, %ButtonCapsLockOff,  "CapsLock off", 120, 15, 50, 15
            
             DIALOG SHOW MODAL hDlg CALL DlgProc
            
             DestroyIcon(hIconSmall)
             DestroyIcon(hIconBig)
            
            END FUNCTION
            '_____________________________________________________________________________
            '​

            Comment


              #26
              Thanks Pierre

              I have decided to shoot the guy who designed the keyboard so that the shift key and the caps lock are together on the left hand (ie the weakest!) part of the keyboard. You may have saved his life!!! But that was probably a long time ago. I will be installing the PBCC version

              Thanks again
              [I]I made a coding error once - but fortunately I fixed it before anyone noticed[/I]
              Kerry Farmer

              Comment


                #27
                Originally posted by Kerry Farmer View Post
                Thanks Pierre

                I have decided to shoot the guy who designed the keyboard ..
                In case you were starting to reach for the firearm again. Here's a tweaked version of Pierre's code for PBCC that works ok (message loop added to feed the hook proc),

                Also added feature so Ctrl+CapsLock continues to work (you may not have noticed that is a normal feature ) just for fun
                '
                Code:
                ' PB https://forum.powerbasic.com/forum/user-to-user-discussions/powerbasic-for-windows/55985-raw-keyboard-hid-input-discussion?p=826692#post826692
                #COMPILE EXE  '#CC 6.0#
                #BREAK ON
                #CONSOLE ON
                %UNICODE = 1
                #INCLUDE "Win32Api.inc"
                OPTION EXPLICIT
                
                GLOBAL ghKeyboardHook AS DWORD
                GLOBAL CtrlDn AS LONG
                '_____________________________________________________________________________
                
                FUNCTION LowLevelKeyboardHookProc(BYVAL nCode AS LONG, BYVAL wParam AS LONG, BYVAL lParam AS LONG)AS LONG
                 LOCAL pKbData AS KBDLLHOOKSTRUCT POINTER
                
                  FUNCTION = CallNextHookEx(ghKeyboardHook, nCode, wParam, pKbData)
                  IF nCode < 0 THEN EXIT FUNCTION
                  IF nCode = %HC_ACTION THEN
                    pKbData = lParam
                    SELECT CASE wParam
                      CASE %WM_KEYDOWN, %WM_KEYUP
                        IF @pKbData.vkCode = %VK_CAPITAL AND ISFALSE CtrlDn THEN
                         WinBeep 800,200
                          FUNCTION = %TRUE
                          EXIT FUNCTION
                        END IF
                    END SELECT
                  END IF
                
                END FUNCTION
                '_____________________________________________________________________________
                
                FUNCTION PBMAIN()
                 CONSOLE NAME " ~ CapsLock > Ctrl + CapsLock "
                 DIM KeyStateArray(256) AS BYTE
                 DIM tmsg AS TAGMSG
                  GetKeyboardState(BYVAL VARPTR(keyStateArray(0)))
                    IF KeyStateArray(%VK_CAPITAL) AND &H01 THEN GOSUB ForceCapsLockOff    'CapsLock was ON
                
                  ghKeyboardHook = SetWindowsHookEx(%WH_KEYBOARD_LL, CODEPTR(LowLevelKeyboardHookProc), _
                                                   GetModuleHandle(BYVAL 0), BYVAL %NULL)
                    PRINT "CapsLock is disabled via hook - use Ctrl + CapsLock instead :)"
                
                  DO WHILE CONSHNDL                ' eg until [X] pressed / console closed via TaskBar
                    ' ** Main program Loop **
                    '..
                    '..
                    PeekMessage (tmsg, %NULL, 0, 0, %PM_NoRemove)              ' message loop rqd to feed keyboard hook
                    IF (GetAsyncKeyState(%VK_CONTROL) AND &H8000) THEN CtrlDn = %True ELSE CtrlDn = 0
                  LOOP UNTIL INKEY$ = $ESC
                  GOSUB ExitFun
                
                 ForceCapsLockOff:
                   Keybd_event(%VK_CAPITAL, 0, %KEYEVENTF_EXTENDEDKEY, 0)
                   Keybd_event(%VK_CAPITAL, 0, %KEYEVENTF_EXTENDEDKEY OR %KEYEVENTF_KEYUP, 0)
                   'Some keyboard driver release <CapLock> by the use of the <Shift> key.
                   Keybd_event(%VK_SHIFT, 0, 0, 0)
                   Keybd_event(%VK_SHIFT, 0, %KEYEVENTF_KEYUP, 0)
                   PRINT "Turning CapsLock OFF..."
                 RETURN
                
                 ExitFun:
                  UnhookWindowsHookEx(ghKeyboardHook)
                
                END FUNCTION
                '_____________________________________________________________________________
                Rgds, Dave

                Comment

                Working...
                X
                😀
                🥰
                🤢
                😎
                😡
                👍
                👎