Preventing the pressing of Caps Lock.

General Help regarding HMG, Compilation, Linking, Samples

Moderator: Rathinagiri

Post Reply
edk
Posts: 911
Joined: Thu Oct 16, 2014 11:35 am
Location: Poland

Preventing the pressing of Caps Lock.

Post by edk »

Hi.
In GUI mode it is quite easy to "disable" the Caps Lock key in the entire application:

Code: Select all

#include "hmg.ch"

FUNCTION Main()

  IF KSetCaps ()
     //Set Caps Lock to OFF
     //KSetCaps ( .F. )  //Turns off Caps Lock but doesn't change the Caps Lock indicator on the keyboard (tested on Win10 1803)
     HMG_PressKey ( VK_CAPITAL )  //"Press" the Caps Lock key.
  ENDIF

  DEFINE WINDOW Demo;
    MAIN;
    ROW    100;
    COL    100;
    WIDTH  490 ;
    HEIGHT 350 ;
    TITLE  "Caps Lock - Prevent";
    NOSIZE;
    NOMAXIMIZE;
    NOMINIMIZE

    DEFINE LABEL EditLabel
      ROW    10
      COL    10
      WIDTH  470
      HEIGHT 13
      VALUE  "EditBox:"
    END LABEL

    DEFINE EDITBOX Edit1
      ROW          25
      COL          10
      WIDTH        470
      HEIGHT       210
      VALUE        ""
    END EDITBOX

    DEFINE LABEL TextLabel
      ROW    245
      COL    10
      WIDTH  470
      HEIGHT 13
      VALUE  "TextBox:"
    END LABEL

    DEFINE TEXTBOX Edit2
      ROW          260
      COL          10
      WIDTH        470
      HEIGHT       23
      VALUE        ""
    END TEXTBOX

    DEFINE BUTTON Exit
      ROW          293
      COL          380
      WIDTH        100
      HEIGHT       25
      CAPTION      "Exit"
      ACTION       Demo.RELEASE
    END BUTTON

  END WINDOW

  CREATE EVENT PROCNAME OnkeyCapsLock ()

  Demo.CENTER
  Demo.ACTIVATE

RETURN NIL

*******************************************************************************
Function OnkeyCapsLock ()
  // Caps Lock  - Prevent
  IF EventMSG () == WM_KEYDOWN .AND. EventWPARAM() == VK_CAPITAL .AND. KSetCaps ()
     //KSetCaps ( .F. )  //Turns off Caps Lock but doesn't change the Caps Lock indicator on the keyboard (tested on Win10 1803)
     HMG_PressKey ( VK_CAPITAL )  //"Press" again the Caps Lock key.
  ENDIF
Return NIL
But how to do it for console mode?

Edward.
KDJ
Posts: 243
Joined: Mon Sep 05, 2016 3:04 am
Location: Poland

Re: Preventing the pressing of Caps Lock.

Post by KDJ »

Hi, Edward

Here is simple way, by using dummy window with timer:

Code: Select all

#include "hmg.ch"
#include "hbgtinfo.ch"
#include "hbthread.ch"
 
REQUEST HB_GT_WVT_DEFAULT

MEMVAR GetList


FUNCTION Main()
  LOCAL cText := Space(30)

  //create dummy window with timer in new thread
  IF (! HB_MTVM()) .or. HB_IsNIL(HB_ThreadStart(HB_THREAD_INHERIT_PUBLIC, @DummyWindow()))
    MsgInfo("Create a new thread is failed!")
  ENDIF
  //

  @  5, 5 TO 11,75 DOUBLE
  @  8,20 GET cText
  READ

  InKey(0)

  QUIT

RETURN NIL


FUNCTION DummyWindow()

  DEFINE WINDOW Dummy MAIN VISIBLE .F.
    DEFINE TIMER DummyTIMER INTERVAL 10 ACTION If((GetForegroundWindow() == PtoN(HB_gtInfo(HB_GTI_WINHANDLE))) .and. IsCapsLockActive(), HMG_PressKey(VK_CAPITAL), NIL)
  END WINDOW

  Dummy.ACTIVATE

RETURN NIL


FUNCTION PtoN(pValue)

  IF HB_IsPointer(pValue)
    RETURN HB_HexToNum(SubStr(HB_ValToStr(pValue), 3))
  ENDIF

RETURN 0
edk
Posts: 911
Joined: Thu Oct 16, 2014 11:35 am
Location: Poland

Re: Preventing the pressing of Caps Lock.

Post by edk »

Krzysztof THANK YOU :D
KDJ
Posts: 243
Joined: Mon Sep 05, 2016 3:04 am
Location: Poland

Re: Preventing the pressing of Caps Lock.

Post by KDJ »

In the previous example, when you press Close button the program freezes.
Here is improved example:

Code: Select all

#include "hmg.ch"
#include "hbgtinfo.ch"
#include "hbthread.ch"
#include "inkey.ch"
 
REQUEST HB_GT_WVT_DEFAULT

MEMVAR GetList


FUNCTION Main()
  LOCAL cText

  //create dummy window with timer in new thread
  IF (! HB_MTVM()) .or. HB_IsNIL(HB_ThreadStart(@DummyWindow()))
    MsgInfo("Create a new thread is failed!")
  ENDIF
  //

  //to generate HB_K_CLOSE after pressing Close button
  HB_gtInfo(HB_GTI_CLOSEMODE, 1)

  Set(_SET_EVENTMASK, INKEY_KEYBOARD + HB_INKEY_GTEVENT)

  SetKey(K_ALT_F4,   { || OnClose() })
  SetKey(HB_K_CLOSE, { || OnClose() })
  SetCancel(.F.)

  DO WHILE .T.
    cText := Space(30)

    CLS
    @  5, 5 TO 11,75 DOUBLE
    @  8,20 GET cText
    READ

    @ 13, 5 SAY cText
    @ 18, 5 SAY "Press Esc to exit or other key to continue ..."

    SWITCH InKey(0)
      CASE K_ALT_F4
      CASE HB_K_CLOSE
        OnClose()
        EXIT
      CASE K_ESC
        QUIT
    ENDSWITCH
  ENDDO

RETURN NIL


FUNCTION OnClose()

  IF MsgOkCancel("Do you want to exit?") == .T.
    QUIT
  ENDIF

RETURN NIL


FUNCTION DummyWindow()

  DEFINE WINDOW Dummy VISIBLE .F.
    DEFINE TIMER DummyTIMER INTERVAL 10 ACTION If((GetForegroundWindow() == PtoN(HB_gtInfo(HB_GTI_WINHANDLE))) .and. IsCapsLockActive(), HMG_PressKey(VK_CAPITAL), NIL)
  END WINDOW

  Dummy.ACTIVATE

RETURN NIL


FUNCTION PtoN(pValue)

  IF HB_IsPointer(pValue)
    RETURN HB_HexToNum(SubStr(HB_ValToStr(pValue), 3))
  ENDIF

RETURN 0
Post Reply