Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi there,

I want to insert text into another application, say text editor, where the text cursor is, from my Perl program. I browsed QandASection: GUI Programming, but there's nothing interesting for my requirements. Give me a hint where to start looking, or full solutions, if you are so inclined. ;)

Pseudocode:

my $apphandle = CurrentApp(); # application in foreground
$apphandle->InsertText('Hello from another program! ☻');

  • Comment on (Windows) insert text at cursor in non-owned window

Replies are listed 'Best First'.
Re: (Windows) insert text at cursor in non-owned window
by BrowserUk (Patriarch) on Aug 18, 2006 at 00:36 UTC

    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.
      #!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.
Re: (Windows) insert text at cursor in non-owned window
by GrandFather (Saint) on Aug 17, 2006 at 22:56 UTC

    You may find Win32::GuiTest helps. Look for SendKeys.


    DWIM is Perl's answer to Gödel
Re: (Windows) insert text at cursor in non-owned window
by liverpole (Monsignor) on Aug 17, 2006 at 22:38 UTC
    There really isn't any straightforward way to easily automate this.  That's because the Perl program and the editor don't have any control over one another.

    If you don't mind being the conduit yourself, and you're just interested in getting data from your Perl program into your text editor (whichever editor that may be), I'd suggest saving the data you want to import to a file.

    It's unclear to what extent you know Perl, but if you are just beginning, a good place to look would be open and print, for the output of data.

    Then, once you're file has been written, the mechanics of reading it into the editor (or whatever other program) will depend entirely on that program.  In vim and gvim, for example, the command :r will read a file.

    Alternatively, you could redirect the results of your Perl program into a file, and then read it in, assuming that the output is exactly what you want to import.

    Finally, both in Windows and Linux, if you're in a windowing environment, you can use cut (or copy) and paste the text that you need.

    But as far as an automated process goes, especially in an editor (which is waiting for user-input), there isn't really a way to do it.


    s''(q.S:$/9=(T1';s;(..)(..);$..=substr+crypt($1,$2),2,3;eg;print$..$/
Re: (Windows) insert text at cursor in non-owned window
by planetscape (Chancellor) on Aug 18, 2006 at 06:33 UTC

      That doesn't help, it does not quite match my requirement. I have no generalised way to paste stuff into the application. I cannot store unicode text on the clipboard. Quote Win32::Clipboard

      The following formats are not recognized by Win32::Clipboard {...}
      CF_UNICODETEXT 13