how to get raw keyboard input in windows ?

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

  1. wbsurfver

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

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

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 (here). After that, you can post your question and our members will help you out.