in reply to (Windows) insert text at cursor in non-owned window

Your pseudocode it a tad too simple. Once you determine the current foreground application, you'll need to find out which of it's windows or controls has the focus and obtain a handle to it. Then you'll need to determine if the control is of a type that will accept keystrokes.

Detecting that it's an editable text control isn't enough as it may be set readonly. Or it could be programmed to accept only numbers. Or a limited number of keystrokes, and the user may have already type something. If the user has highlighted the existing contents, your insertion will overwrite that. Same is true if the keyboard is in overwrite state.

Finally, how will your application decide when to send the keystrokes?

As by implication, it will not be in the foreground, it will not be in a position to accept user initiation of the insertion; and if you do it at some predetermined time or after some number of elapsed seconds, how will you know that the right application is in the foreground?

What you are asking to do is possible with Win32::GuiTest, but it is definitely not trivial. Depending upon what you are actually trying to achieve, it may well be easier to use an existing solution.


Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
Lingua non convalesco, consenesco et abolesco. -- Rule 1 has a caveat! -- Who broke the cabal?
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
  • Comment on Re: (Windows) insert text at cursor in non-owned window

Replies are listed 'Best First'.
Re^2: (Windows) insert text at cursor in non-owned window
by Anonymous Monk on Aug 18, 2006 at 02:19 UTC
    #!perl use utf8; use Win32::GuiTest qw(SendKeys); $Win32::GuiTest::debug = 1;
    SendKeys('Hello from another program! ☻ aáàâāăą');

    That was easy. But in the foreground application, I get

    Hello from another program! aÄÄÄ

    What's that now?

      That is the symptom of the use of different character encodings.
      I suppose, by the look of it, that you sent a string in Unicode. The receiving application either didn't interpret it as Unicode or is not able to render it on screen.

        I tried it with Xchat, Seamonkey Composer, Opera, DimSum and Unipad. (All written with different toolkits, but Windows application nonetheless.) They exhibit the same symptoms. I'm 100% certain they are unicode capable. I exchange unicode characters freely and without problem among those applications.

        The problem must be with the Perl program.