How to get raw keyboard input in windows?

I have this program, it just runs and anytime the clipboard changes
and contains some large size,
it run the speech thing through win-sapi. So I can go to any website,
highlight some text and copy it to the clipboard and it will speak the
text. I can’t get it to interupt very well. If you hit control-c it
won’t
stop until it’s done with the text, thus I broke it into lines.

Here’s my current problem:
I would like to be able to read raw keyboard data, so that if I hit
spacebar or some function key, it would pause, even if the dos shell
running the program was not in focus. How can I do that ?


require ‘win32/clipboard’
include Win32
require ‘win32ole’

class MySpeech

def initialize

@obj_voice = WIN32OLE.new(“SAPI.SpVoice”)
@obj_get_voices = @obj_voice.GetVoices

@obj_get_voices.each { |voice| puts voice.GetDescription }

end

def talk(txt)
done = false
lines = txt.split(/$/)
lines.each do |ln|
@obj_voice.speak ln
end
end

def run
prev = Clipboard.data
while true
curr = Clipboard.data
if curr and curr != prev and curr.length > 80
talk curr
prev = curr
end
end
end

end

spkthr = Thread.new do
spk = MySpeech.new
spk.run
end

spkthr.join

On Sat, 29 Mar 2008 05:07:37 -0700, [email protected] wrote:

Here’s my current problem:
I would like to be able to read raw keyboard data, so that if I hit
spacebar or some function key, it would pause, even if the dos shell
running the program was not in focus. How can I do that ?

You’re trying to do something outside of normal Windows functionality.
It
is possible, but difficult and brittle.

Look at the function SetWindowsHookEx here:
http://msdn2.microsoft.com/en-us/library/ms644990.aspx. If you
specify
0 for the thread ID, you can hook all of the applications and monitor
their keyboard events.

The problem with doing this is that you have to create a DLL with a
function that will signal your process via some sort of IPC. When you
call SetWindowsHookEx, your DLL will be loaded into the address space
of each process you hook. You have to be very careful that your code
doesn’t do anything nasty, as it will be running in every process with a
message pump on the system and could potentially bring the whole thing
to
its knees.

Finally, IME some parts of the hooking API (notably the mouse hooking)
don’t work as advertised. I don’t recall any specific problems with the
keyboard, but keep your eyes peeled.

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs