Set NumLock

Windows specific questions.
Post Reply
MichaelW
Posts: 3500
Joined: May 16, 2006 22:34
Location: USA

Set NumLock

Post by MichaelW »

Code: Select all

#include "windows.bi"
dim ki(0 to 1) as INPUT_
if GetKeyState(VK_NUMLOCK) = 0 then
    ki(0).type = INPUT_KEYBOARD
    ki(0).ki.wVk = VK_NUMLOCK
    ki(0).ki.dwFlags = 0
    ki(1).type = INPUT_KEYBOARD
    ki(1).ki.wVk = VK_NUMLOCK
    ki(1).ki.dwFlags = KEYEVENTF_KEYUP
    SendInput( 2, @ki(0), sizeof(ki) )
end if
sleep
Pierre Bellisle
Posts: 56
Joined: Dec 11, 2016 17:22

Re: Set NumLock

Post by Pierre Bellisle »

Hi Michael,

Another one...

Pierre

Code: Select all

#Print Keyboard led Windows 32/64
#Print Coded written under FreeBASIC 1.05.0 
#Ifdef __FB_64BIT__
  #Print 64bit compiler used
#Else
  #Print 32bit compiler used
#EndIf
#Lang "fb"

#Include Once "windows.bi"
#Define Unicode

#Define Tabb       Chr(9)
#Define CrLf       Chr(13, 10)
#Define KbReset    0
#Define KbSet      1
#Define KbRead     2
#Define KbToggle   3
#Define KbSave     4
#Define KbRestore  5

Sub KeyStateSub(VKkey As Long, SetResetToggle As Long, keyStateArray() As Byte)
 keybd_event(VKkey, 0, KEYEVENTF_EXTENDEDKEY, 0)
 keybd_event(VKkey, 0, KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
 If VKkey = VK_CAPITAL Then
   If SetResetToggle = KbReset Then
     '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)
   End If
 End If
 KeyStateArray(VKkey) = SetResetToggle
 SetKeyboardState(ByVal VarPtr(keyStateArray(0)))
 
End Sub

Function KeyState(VKkey As Long, Action As Long) As Long
 Dim    SetResetToggle     As Long
 Dim    KeyStateArray(256) As Byte
 Static KeyStateCaps       As Byte
 Static KeyStateNum        As Byte
 Static KeyStateScroll     As Byte
 Static KeyStateInsert     As Byte

 GetKeyboardState(ByVal VarPtr(keyStateArray(0)))

 Select Case Action

   Case KbSave
     KeyStateCaps   = KeyStateArray(VK_CAPITAL)
     KeyStateNum    = KeyStateArray(VK_NUMLOCK)
     KeyStateScroll = KeyStateArray(VK_SCROLL)
     KeyStateInsert = KeyStateArray(VK_INSERT)

   Case KbRestore
     If KeyStateArray(VK_CAPITAL) <> KeyStateCaps Then
       SetResetToggle = KeyStateCaps : VkKey = VK_CAPITAL  : KeyStateSub(VKkey, SetResetToggle, keyStateArray())
     End If
     If KeyStateArray(VK_NUMLOCK) <> KeyStateNum Then
       SetResetToggle = KeyStateNum : VkKey = VK_NUMLOCK   : KeyStateSub(VKkey, SetResetToggle, keyStateArray())
     End If
     If KeyStateArray(VK_SCROLL) <> KeyStateScroll Then
       SetResetToggle = KeyStateScroll : VkKey = VK_SCROLL : KeyStateSub(VKkey, SetResetToggle, keyStateArray())
     End If
     If KeyStateArray(VK_INSERT) <> KeyStateInsert Then
       SetResetToggle = KeyStateInsert : VkKey = VK_INSERT : KeyStateSub(VKkey, SetResetToggle, keyStateArray())
     End If

   Case KbToggle
     If KeyStateArray(VKkey) = 0 Then
       SetResetToggle = KbSet
     Else
       SetResetToggle = KbReSet
     End If
     KeyStateSub(VKkey,SetResetToggle, keyStateArray())

   Case KbSet
     If KeyStateArray(VKkey) = 0 Then
       SetResetToggle = Action
       KeyStateSub(VKkey,SetResetToggle, keyStateArray())
     End If

   Case KbReset
     If KeyStateArray(VKkey) = 1 Then
       SetResetToggle = Action
       KeyStateSub(VKkey,SetResetToggle, keyStateArray())
     End If

   Case KbRead
     Function = KeyStateArray(VKkey)

 End Select

End Function

 Dim Looper     As Long
 Dim InsertStare As Long
 Dim Buffer      As String

 MessageBox(0,_                       'Get keyboard status and show it
           "Insert: "   & Tabb & Str(InsertStare) & Buffer         & CrLf & _
           "Numlock:"   & Tabb & Str(KeyState(VK_NUMLOCK, KbRead)) & CrLf & _
           "Capslock:"  & Tabb & Str(KeyState(VK_CAPITAL, KbRead)) & CrLf & _
           "Scrollock:" & Tabb & Str(KeyState(VK_SCROLL,  KbRead)) & CrLf & CrLf & _
           "See current state, click ""OK"" to start", _
           "KeyState", MB_ICONINFORMATION Or MB_OK)

 MessageBox(0, "Look at keyboard light", "KeyState", _
            MB_ICONINFORMATION Or MB_OK)

 KeyState(0, KbSave)                   'Save keyboard status
 
 KeyState(VK_NUMLOCK, KbReset)         'Set NumLock off
 KeyState(VK_CAPITAL, KbReset)         'Set CapLock off
 KeyState(VK_SCROLL , KbReset)         'Set ScrollLock off

 For Looper = 1 To 5
   KeyState(VK_SCROLL , KbReset)       'Set ScrollLock off
   KeyState(VK_NUMLOCK, KbSet)         'Set NumLock on
   Sleep 300
   KeyState(VK_NUMLOCK, KbReset)       'Set NumLock off
   KeyState(VK_CAPITAL, KbSet)         'Set CapLock on
   Sleep 300
   KeyState(VK_CAPITAL, KbReset)       'Set CapLock off
   KeyState(VK_SCROLL , KbSet)         'Set ScrollLock on
   Sleep 300
 Next

 KeyState(VK_INSERT, KbToggle)         'Togggle the insert state
 InsertStare = KeyState(VK_INSERT, KbRead) 'Check if we are in <Insert> or <OverWrite> mode
 If InsertStare = 0 Then
   Buffer = " (Overwrite mode)"
 Else
   Buffer = " (Insert mode)"
 End If

 MessageBox(0,_                        'Get keyboard status and show it
           "Insert: "   & Tabb & Str(InsertStare) & Buffer         & CrLf & _
           "Numlock:"   & Tabb & Str(KeyState(VK_NUMLOCK, KbRead)) & CrLf & _
           "Capslock:"  & Tabb & Str(KeyState(VK_CAPITAL, KbRead)) & CrLf & _
           "Scrollock:" & Tabb & Str(KeyState(VK_SCROLL,  KbRead)) & CrLf & CrLf & _
           "Click ""OK"" to go back to initial keyboard state", _
           "KeyState", MB_ICONINFORMATION Or MB_OK)

 KeyState(0, KbRestore)                'Restore keyboard status as it was before
  
Post Reply