how to get raw keyboard input in windows ?

Discussion in 'Ruby' started by wbsurfver@yahoo.com, Mar 29, 2008.

  1. Guest

    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
     
    , Mar 29, 2008
    #1
    1. Advertising

  2. On Sat, 29 Mar 2008 05:07:37 -0700, 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
     
    Charles Calvert, Mar 29, 2008
    #2
    1. Advertising

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

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Replies:
    3
    Views:
    746
    ChrisWSU
    Jun 27, 2005
  2. hokiegal99

    Raw Input Question

    hokiegal99, Aug 27, 2003, in forum: Python
    Replies:
    3
    Views:
    722
    hokiegal99
    Aug 27, 2003
  3. Noah

    raw audio input on Windows

    Noah, Jan 27, 2004, in forum: Python
    Replies:
    1
    Views:
    489
    Kevin Dahlhausen
    Jan 28, 2004
  4. Replies:
    4
    Views:
    702
    Walter Roberson
    Sep 9, 2005
  5. Brice Rebsamen

    termios and keyboard medium raw mode

    Brice Rebsamen, Mar 13, 2008, in forum: C Programming
    Replies:
    2
    Views:
    2,894
    Mark Bluemel
    Mar 13, 2008
Loading...

Share This Page