Run Program correlated to WaitWindowOpen
Moderators: Dorian (MJT support), JRL
-
- Junior Coder
- Posts: 35
- Joined: Thu Jan 12, 2006 9:20 pm
- Contact:
Run Program correlated to WaitWindowOpen
Is there a way to correlate Run Program to WaitWindowOpen when you don't know what the caption will be?
I hardly ever say no. But logic would dictate that since a program can spawn a window with any title. The operating system can't possibly detect the title of a window until that window has opened. If the window is already open then WaitWindowOpen> will always evaluate to "true".
I could see a potential for using GetWindowList> and GetWindowProcess> to tie an unknown window name to the spawning process.
Something like this: This does not check for the process already being open.
I could see a potential for using GetWindowList> and GetWindowProcess> to tie an unknown window name to the spawning process.
Something like this: This does not check for the process already being open.
Code: Select all
Let>ProcessName=NotePad.exe
Let>msg_width=500
Run>%ProcessName%
Let>rp_wait=1
Let>rp_windowmode=0
Run>cmd /c tasklist.exe /FI "imagename eq %ProcessName%">%Temp_Dir%processlist.txt
ReadFile>%Temp_Dir%processlist.txt,ProcessList
GetWindowList>WinList
Separate>WinList,%CRLF%,Window
Let>kk=0
Repeat>kk
Add>kk,1
Let>value=Window_%kk%
GetWindowProcess>value,ProcID,ProcName
If>%ProcID%<100,Skip
Separate>ProcessList,ProcID,var
If>var_count>1
MDL>Process ID = %ProcID%%crlf%Process Name = %ProcName%%crlf%Window Name = %value%
Exit>0
EndIf
Label>Skip
Until>kk,Window_Count
MDL>Process not found
Last edited by JRL on Wed Jul 15, 2009 3:41 pm, edited 1 time in total.
Try WaitWindowChanged and GetActiveWindow
Hi chihuahualand,
You could use WaitWindowChanged to tell you when a new window opened.
Then use GetActiveWindow to get the title or handle of the window.
Gale
You could use WaitWindowChanged to tell you when a new window opened.
Then use GetActiveWindow to get the title or handle of the window.
Gale
-
- Junior Coder
- Posts: 35
- Joined: Thu Jan 12, 2006 9:20 pm
- Contact:
-
- Junior Coder
- Posts: 35
- Joined: Thu Jan 12, 2006 9:20 pm
- Contact:
JRL;
I agree, Gale's solution is robust and very easy to implement.
no slight was intended...
but unless I'm mistaken, the window can't be guaranteed to be that of the Run Program... It's an assumption, albeit a good one, it's still an assumption and on a slow or heavily loaded machine the issue can become exacerbated.
and this not a complaint just whining. possibly simply thinking out loud.
This script is for KB updates to MS Office XP. There's about 30 of these silly things. While similar, there are slight variations... and I'm wishing for something that is totally FU-proof. I have a workaround with creating a list of programs and the respective captions. It's just clunky.
The original post was to glean innovative and clever ideas from innovative and clever folks. Yours was one, the kind of thing I was looking for. My reply was uncalled for... It was exasperation after a long day. I apologize.
I agree, Gale's solution is robust and very easy to implement.
no slight was intended...
but unless I'm mistaken, the window can't be guaranteed to be that of the Run Program... It's an assumption, albeit a good one, it's still an assumption and on a slow or heavily loaded machine the issue can become exacerbated.
and this not a complaint just whining. possibly simply thinking out loud.
This script is for KB updates to MS Office XP. There's about 30 of these silly things. While similar, there are slight variations... and I'm wishing for something that is totally FU-proof. I have a workaround with creating a list of programs and the respective captions. It's just clunky.
The original post was to glean innovative and clever ideas from innovative and clever folks. Yours was one, the kind of thing I was looking for. My reply was uncalled for... It was exasperation after a long day. I apologize.
Absolutely foolproof?
I don't think it is possible to be absolutely certain the next window to display was started by your application without knowing something about what you expect. You could do additional checking of the window that displayed to determine if it is yours.
There are some posts on an IsProcessRunning vbscript function that may help. Normally the window will open with a known owner property. There could be some exceptions. The difficult part will be distinquishing various error windows your run command triggered with different owners from totally unrelated and unsolicated windows that may display at any time.
Gale
There are some posts on an IsProcessRunning vbscript function that may help. Normally the window will open with a known owner property. There could be some exceptions. The difficult part will be distinquishing various error windows your run command triggered with different owners from totally unrelated and unsolicated windows that may display at any time.
Gale
Last edited by gdyvig on Fri Jul 17, 2009 3:39 am, edited 1 time in total.
- Bob Hansen
- Automation Wizard
- Posts: 2475
- Joined: Tue Sep 24, 2002 3:47 am
- Location: Salem, New Hampshire, US
- Contact:
You might want to look at some of the tools in SysInternals. It may be possible to create a log of window openings and parse out the info that you need, or use it to crate your own log of what is open/closed.
Home page is now: http://technet.microsoft.com/en-us/sysi ... fault.aspx since it was acquired by Microsoft.
Forum page is here: http://forum.sysinternals.com/ Someone there can probably give you the correct command line(s) to include your Macro Scheduler script.
I cannot suggest a specific tool right now but Process Monitor and PS Tools are probably the most likely candidates. The whole Suite is worth having in your toolbox (FREE).
Home page is now: http://technet.microsoft.com/en-us/sysi ... fault.aspx since it was acquired by Microsoft.
Forum page is here: http://forum.sysinternals.com/ Someone there can probably give you the correct command line(s) to include your Macro Scheduler script.
I cannot suggest a specific tool right now but Process Monitor and PS Tools are probably the most likely candidates. The whole Suite is worth having in your toolbox (FREE).
Hope this was helpful..................good luck,
Bob
A humble man and PROUD of it!
Bob
A humble man and PROUD of it!
I think, using process ID, that its possible to be certain that a currently active window was or was not spawned by a specified process. I rewrote what I posted above to make it faster and easier to use. Place the WFUW subroutine in your script then call it with two parameters, the name of the process whose windows you want to detect and a timeout value. If the timeout value is "0' it will wait forever or until a matching window becomes the active window.
As posted, the routine will wait for a notepad window to become the currently active window. When a notepad window becomes the current active window a message box will pop up.
If you start this script, then open notepad the message box will pop up right way.
If you first open notepad, put the notepad screen in the background, then start the script. The message box will not pop up until the notepad window becomes the current active window.
If multiples of notepad are open, only the last window opened will trigger the subroutine.
As posted, the routine will wait for a notepad window to become the currently active window. When a notepad window becomes the current active window a message box will pop up.
If you start this script, then open notepad the message box will pop up right way.
If you first open notepad, put the notepad screen in the background, then start the script. The message box will not pop up until the notepad window becomes the current active window.
If multiples of notepad are open, only the last window opened will trigger the subroutine.
Code: Select all
Let>msg_width=500
//WFUW Usage:
//GoSub>WFUW,Process Name (as Shown in Task Manager),Wait Timeout
//The descriptive name for this sub is WaitForUnknownWindowFromSpecifiedProcess
GoSub>WFUW,notepad.exe,0
If>%WFUW_Result%=WaitForUnknownWindowFromSpecifiedProcess Timed Out
MDL>**TIMED OUT**%CRLF%%WFUW_Result%%CRLF%Process ID = %pid%%crlf%Window ProcID = %ProcID%%CRLF%Current Active Window = %WinTitle%%crlf%Total time = %TotalTime%
Else
MDL>**FOUND**%CRLF%%WFUW_Result%%CRLF%Process ID = %pid%%crlf%Window ProcID = %ProcID%%CRLF%Current Active Window = %WinTitle%%crlf%Total time = %TotalTime%
EndIf
SRT>WFUW
//Error checking - make sure there are parameters
Assigned>WFUW_var_1,WFUW_answer
If>WFUW_answer=FALSE,NoParameters
If>%WFUW_var_1%=,NoParameters
Assigned>WFUW_var_2,WFUW_answer
If>WFUW_answer=TRUE
//If timeout is set to zero or nothing then set timeout to large number (basically no timeout)
If>{(%WFUW_var_2%=0)or(%WFUW_var_2%="")}
Let>WFUW_var_2=99999999999999999999999999999999999999
EndIf
Else
Let>WFUW_var_2=99999999999999999999999999999999999999
EndIf
//Marcus provided VBScript to get Process ID http://www.mjtnet.com/usergroup/viewtopic.php?t=5476
VBSTART
Function GetPID(pgm)
set wmi = getobject("winmgmts:")
sQuery = "select * from win32_process " & "where name='" & pgm & "'"
set processes = wmi.execquery(sQuery)
for each process in processes
getPID = process.ProcessID
next
End Function
VBEND
//Start timeout timer
VBEval>timer,StartTime
//Working Loop Starts here//
Label>WFUW_Start
//Aquire the current window title
GetActiveWindow>WinTitle,WinX,WinY
//Get Process ID of named process
VBEval>GetPID("%WFUW_var_1%"),pid
//Get Process ID from current active window
GetWindowProcess>WinTitle,ProcID,ProcName
//Check for timeout
VBEval>timer-%StartTime%,TotalTime
If>%TotalTime%>%WFUW_var_2%
Let>WFUW_Result=WaitForUnknownWindowFromSpecifiedProcess Timed Out
Goto>WFUW_End
EndIf
//Compare Process ID of specified process and ID of current active window
If>%pid%=%ProcID%
Let>WFUW_Result=WaitForUnknownWindowFromSpecifiedProcess found
Goto>WFUW_End
EndIf
Wait>0.01
Goto>WFUW_Start
//Working Loop Ends here//
Label>WFUW_End
Let>WFUW_var_1=
Let>WFUW_var_2=
Label>NoParameters
END>WFUW
GetWindowProcess
I found another simpler command:
GetWindowProcess>window_title,process_id,process_name
You can compare process_name with the executable filename - they should match.
Gale
-----------------------------------------------------------------------
Oops, as JRL noted in the next post, he is already using this command. I was focusing on the vbscript portion and did not notice.
GetWindowProcess>window_title,process_id,process_name
You can compare process_name with the executable filename - they should match.
Gale
-----------------------------------------------------------------------
Oops, as JRL noted in the next post, he is already using this command. I was focusing on the vbscript portion and did not notice.
Last edited by gdyvig on Fri Jul 17, 2009 5:13 am, edited 1 time in total.
That's half of what makes the above posted subroutine work. See line 52. The problem with just matching the window name with the process name occurs when you have the same process running more than once. You really need to tie the window title to the Process ID to know for sure whether a given process spawned a given window.GetWindowProcess>window_title,process_id,process_name