I don't get your problem. Why do you need to fork?
If you just need to wait between keystrokes (e.g. sending the filename to the window, then wait for some 10 seconds or some other conservative value depending on your local machine configuration, then send a carriage return to "press the OK button"), you can implement that yourself in your perl script.
I once implemented this sendkeys stuff as a tool in VBScript, with a syntax extension to the WSH (Windows Script Host) sendkeys syntax that allows for time delays to be included as escapes in the sendkeys string. Maybe the code helps you. Source of file "sendkeys.vbs" (NOTE: Yes, this is VBScript, not Perl, and yes, yes, I know you don't like VBScript, neither do I):
Option Explicit ' -------------------------------------------------- ' Setup ' -------------------------------------------------- ' Essential Variables Dim ApplicationTitle Dim ApplicationPath Dim ApplicationStartupDelay Dim ApplicationSendkeysDelay Dim SendkeysTextFile Dim SendkeysText Dim Matches Dim Regex Dim DelayMatches Dim DelayRegex ' Sendkeys Escaping Mechanism Detection - matches WSH Sendkeys escapes + Set Regex = New RegExp Regex.Pattern = "^(\~|\+.|\^.|\%.|{[^}]+}|{}})" ' Add Delay Feature to Sendkeys Syntax Set DelayRegex = New RegExp DelayRegex.Pattern = "^{DELAY [0-9]+}$" ' Helper Stuff Dim Wsh Dim Fso Dim Tso Dim i Dim s Dim buf ' Arguments and Configuration If (WScript.Arguments.Count < 3 ) Then PrintUsage() SendkeysTextFile = WScript.Arguments.Item(0) ApplicationTitle = WScript.Arguments.Item(1) ApplicationPath = WScript.Arguments.Item(2) ' Wrap in quotes for passing to Shell again ApplicationPath = """" & ApplicationPath & """" If (WScript.Arguments.Count > 3 ) Then ApplicationStartupDelay = WScript.Arguments.Item(3) Else ApplicationStartupDelay = 1000 End If If (WScript.Arguments.Count > 4 ) Then ApplicationSendkeysDelay = WScript.Arguments.Item(4) Else ApplicationSendkeysDelay = 100 End If ' Files Set Wsh = CreateObject("WScript.Shell") Set Fso = CreateObject("Scripting.FileSystemObject") Set Tso = Fso.OpenTextFile(SendkeysTextFile) SendkeysText = Tso.ReadAll() ' -------------------------------------------------- ' Action ' -------------------------------------------------- If (not (Wsh.AppActivate(ApplicationTitle))) Then Wsh.Run(ApplicationPath) Wscript.Sleep(ApplicationStartupDelay) if (not (Wsh.AppActivate(ApplicationTitle))) Then WScript.Echo("Error: Could not activate application" & _ ApplicationTitle & " using path " & _ ApplicationPath) WScript.Quit(1) End If End if For i = 1 To (Len(SendkeysText)) s = Mid(SendkeysText, i, 1) set Matches = Regex.Execute(Mid(SendkeysText, _ i,Len(SendkeysText) - i + 1)) If (Matches.Count > 0) Then buf = Matches.Item(0).Value i = i + Matches.Item(0).Length - 1 ' Wscript.Echo("===> " & buf & " <===") & vbCrLf If (DelayRegex.Test(buf)) Then set DelayMatches = DelayRegex.Execute(buf) Wscript.Sleep(Mid(DelayMatches.Item(0).Value, _ Len("{DELAY ") + 1, _ (Len(DelayMatches.Item(0).Value) _ - (Len("{DELAY ") + 1)))) Else Wsh.Sendkeys(buf) End If Else Wsh.Sendkeys(s) End If Wscript.Sleep(ApplicationSendkeysDelay) Next Wscript.Quit(0) ' -------------------------------------------------- ' subs ' -------------------------------------------------- Sub PrintUsage Dim UsageText UsageText = vbCrLf & _ "Usage: sendkeys <cmd-file> <app-title> <app-path> " & _ "[startup-delay] [sendkeys-delay]" & vbCrLf & _ vbCrLf & _ "Arguments and Options:" & vbCrLf & _ vbCrLf & _ " cmd-file: file containing keys to send " & vbCrLf & _ " app-title: window title of target application window" & v +bCrLf & _ " app-path: path to target application" & vbCrLf & _ " startup-delay: delay after application startup (in millis +econds, default 1000)" & vbCrLf & _ " sendkeys-delay: delay between keys (in milliseconds, defa +ult 100)" & vbCrLf & _ vbCrLf WScript.Echo(UsageText) WScript.Quit(1) End Sub
Christian Lemburg
Brainbench MVP for Perl
http://www.brainbench.com
In reply to Re: Re: Re: OLE print to a file
by clemburg
in thread OLE print to a file
by physi
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |