Hello,
I'm trying to use the Win32API library in ruby to force num-lock. I found
the following perl snippet (which should work with perl, I think) on the net
and I converted it to ruby:
use Win32::API;
$GetKeyboardState = new Win32::API('user32', 'GetKeyboardState',
['P'], 'N');
$SetKeyboardState = new Win32::API('user32', 'SetKeyboardState',
['P'], 'V');
my $keyboardstate = "\0" x 256;
$GetKeyboardState->Call($keyboardstate);
substr($keyboardstate, 0x90, 1) = chr(1); # VK_NUMLOCK = 0x90
$SetKeyboardState->Call($keyboardstate);
-------ruby below----------
VK_NUMLOCK = 0x90
getKeyboardState = Win32API.new('user32', 'GetKeyboardState', ['P'], 'N')
setKeyboardState = Win32API.new('user32', 'SetKeyboardState', ['P'], 'V')
state = 0.chr * 256
getKeyboardState.call(state)
state[VK_NUMLOCK] = 1.chr
setKeyboardState.call(state)
However, this does not change the num-lock; in fact, nothing at all happens
(no errors either). I've tried making a keyboard state byte array when I
set caps lock, num lock, or press shift down. Then, I compared that to a
keyboard state where I press nothing on the keyboard but it seems that there
is no difference; for some reason, the keyboard state is not recording
correctly? BTW, GetKeyboardState takes in a byte array and writes to it.
Do I need to unpack it somehow? Since there is no byte type in ruby-- I'm
guessing character should work too...
I'm using cygwin version 1.3.2 on Windows 98 (Japanese edition) and ruby
version 1.6.3 [i386-cygwin]. Any help would be greatly appreciated.
Thank you,
Norman Su