# How to get raw keyboard input in windows?

**URL:** <https://www.ruby-forum.com/t/how-to-get-raw-keyboard-input-in-windows/133256>\
**Category:** Ruby\
**Created:** [March 29, 2008, 1:10pm UTC](https://www.ruby-forum.com/t/how-to-get-raw-keyboard-input-in-windows/133256 "2008-03-29T13:10:35Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [March 29, 2008, 1:10pm UTC](https://www.ruby-forum.com/t/how-to-get-raw-keyboard-input-in-windows/133256/1 "2008-03-29T13:10:35Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![casper\_the\_ghost](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/c/58956e/32.png) [@casper\_the\_ghost](https://www.ruby-forum.com/u/casper_the_ghost)\
**Post date:** [March 29, 2008, 9:30pm UTC](https://www.ruby-forum.com/t/how-to-get-raw-keyboard-input-in-windows/133256/2 "2008-03-29T21:30:34Z")

</div>

On Sat, 29 Mar 2008 05:07:37 -0700, removed\_email\_address@domain.invalid 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](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.
