|
|
|
|
||||||
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
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 |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
On Sat, 29 Mar 2008 05:07:37 -0700, wbsurfver@yahoo.com 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. -- Charles Calvert | Software Design/Development Celtic Wolf, Inc. | Project Management http://www.celticwolf.com/ | Technical Writing (703) 580-0210 | Research |
|
![]() |
| Outils de la discussion | |
|
|