Page 1 of 1

Switch Off Num Lock

Posted: Mon Nov 26, 2012 3:13 am
by IdeasVacuum
This code switches Num Lock on:

Code: Select all

Global NumLockOn.INPUT
       NumLockOn\type = #INPUT_KEYBOARD
       NumLockOn\ki\wVk = #VK_NUMLOCK
       NumLockOn\ki\wScan = 144
       NumLockOn\ki\dwFlags = 0
       NumLockOn\ki\time = 0
       NumLockOn\ki\dwExtraInfo = 0

If(GetKeyState_(#VK_NUMLOCK) = #False) : SendInput_(1,@NumLockOn,SizeOf(INPUT)) : EndIf
This code however, does not switch Num Lock off:

Code: Select all

Global NumLockOff.INPUT
       NumLockOff\type = #INPUT_KEYBOARD
       NumLockOff\ki\wVk = #VK_NUMLOCK
       NumLockOff\ki\wScan = 144
       NumLockOff\ki\dwFlags = #KEYEVENTF_KEYUP
       NumLockOff\ki\time = 0
       NumLockOff\ki\dwExtraInfo = 0

If(GetKeyState_(#VK_NUMLOCK) = #True) : SendInput_(1,@NumLockOff,SizeOf(INPUT)) : EndIf
What am I doing wrong?

Re: Switch Off Num Lock

Posted: Mon Nov 26, 2012 3:52 am
by netmaestro
You must press and release the key, as you would physically:

Code: Select all

Procedure NumLock_ON()
  Dim numlock.INPUT(1)
  
  With numlock(0)
    \type = #INPUT_KEYBOARD
    \ki\wVk = #VK_NUMLOCK
    \ki\wScan = 144
    \ki\dwFlags = 0
    \ki\time = 0
    \ki\dwExtraInfo = 0
  EndWith
  
  With numlock(1)
    \type = #INPUT_KEYBOARD
    \ki\wVk = #VK_NUMLOCK
    \ki\wScan = 144
    \ki\dwFlags = #KEYEVENTF_KEYUP
    \ki\time = 0
    \ki\dwExtraInfo = 0
  EndWith
  
  If Not GetKeyState_(#VK_NUMLOCK)
    SendInput_(2,@NumLock(),SizeOf(INPUT)) 
  EndIf
  
  ProcedureReturn
EndProcedure

Procedure NumLock_OFF()
  Dim numlock.INPUT(3)
  
  With numlock(0)
    \type = #INPUT_KEYBOARD
    \ki\wVk = #VK_NUMLOCK
    \ki\wScan = 144
    \ki\dwFlags = 0
    \ki\time = 0
    \ki\dwExtraInfo = 0
  EndWith
  
  With numlock(1)
    \type = #INPUT_KEYBOARD
    \ki\wVk = #VK_NUMLOCK
    \ki\wScan = 144
    \ki\dwFlags = #KEYEVENTF_KEYUP
    \ki\time = 0
    \ki\dwExtraInfo = 0
  EndWith
  
  If GetKeyState_(#VK_NUMLOCK)
    SendInput_(2,@NumLock(),SizeOf(INPUT)) 
  EndIf
  
  ProcedureReturn
EndProcedure


NumLock_ON()

Delay(3000)

NumLock_OFF()

Re: Switch Off Num Lock

Posted: Mon Nov 26, 2012 4:05 am
by ts-soft
This switches the numlock :mrgreen:

Code: Select all

Procedure SwitchNumlock()
  keybd_event_(#VK_NUMLOCK, 0, 0, 0) 
  keybd_event_(#VK_NUMLOCK, 0, #KEYEVENTF_KEYUP, 0)
EndProcedure

For i = 0 To 100
  SwitchNumlock()
  Delay(200)
Next

Re: Switch Off Num Lock

Posted: Mon Nov 26, 2012 4:11 am
by netmaestro
Deprecated :wink:

Re: Switch Off Num Lock

Posted: Mon Nov 26, 2012 4:20 am
by IdeasVacuum
Thanks netmaestro, I'll stick with the SendInput method.

Works really nicely, I think I'll just sit here for a while watching the LED toggle on/of.........

Re: Switch Off Num Lock

Posted: Mon Nov 26, 2012 4:34 am
by netmaestro
Works really nicely, I think I'll just sit here for a while watching the LED toggle on/of.........
I bet it doesn't cost your family much to please you at Christmas :D

Re: Switch Off Num Lock

Posted: Mon Nov 26, 2012 5:27 am
by IdeasVacuum
..... could use the keyboard as an xmas tree light :idea:

Re: Switch Off Num Lock

Posted: Mon Nov 26, 2012 8:48 am
by MachineCode
netmaestro wrote:Deprecated :wink:
Not until Microsoft removes it from the OS. ;)

Re: Switch Off Num Lock

Posted: Mon Nov 26, 2012 9:42 am
by Shield
Well it is officially marked as superseded by Microsoft.
So SendInput should be used.

Re: Switch Off Num Lock

Posted: Mon Nov 26, 2012 3:56 pm
by IdeasVacuum
Thanks for your tip too TS-Soft, didn't spot it was yours yesterday because for some strange reason netmaestro's frog image replaced yours........ :shock:

Looks as though MS are finally moving away from some of the older API. You can often see why they would want to, but sometimes the replacement could have been better designed.