how to get raw keyboard input in windows ?

W

wbsurfver

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
 
C

Charles Calvert

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,024
Latest member
ARDU_PROgrammER

Latest Threads

Top