How would one go about checking the following during some kind of while loop setup?
1) Detect when a button is enabled in a sub-child window whose title changes at the point of the button being enabled?
2) Detect when a sub-child window changes its title?
During a rendering process in Reaper, a child window appears to make the rendering settings. Upon clicking Render on that child window, a sub-child window appears whose title is "Rendering to file...". When the rendering process is finished, the title of that sub-child window changes to "Finished in xxxx.yyyyyy seconds", and then the "Close" button is enabled, as well as two other buttons are created.
Currently I am Sleep(ing) for about 3 minutes (Sleep, 1800000) to wait for this process to finish, but often times this is far more time than needed, and a few times it isn't enough. And then there's been times when launching the rendering process hasn't occurred because something hung in the system causing a delay prior to its execution.
I would much rather detect when these child windows appear before going on to the next step, but haven't learned how that works in AHK. I've looked up While-Loop, but that didn't seem like an option for detecting child window status. I've thought about using GetControl on the "Close" button (Button1 in this case), but I read somewhere that it depends on the window title, which changes.
Would you gurus have any advice?
TXShooter
How to detect when a sub-child window WinTitle changes? Topic is solved
- divanebaba
- Posts: 804
- Joined: 20 Dec 2016, 03:53
- Location: Diaspora
Re: How to detect when a sub-child window WinTitle changes?
You could use one timer or more instead of sleeping.
Instead of sleep 180000 you could start there a timer, which every 5 seconds looks for the existence of Win-Title called "Finished" or the one called "Rendering".
Don't forget to use SetTitleMatchMode 1 (window's title must start with the specified WinTitle to be a match.)
In this thread you find a timer. Modify it for own purposes.
Instead of sleep 180000 you could start there a timer, which every 5 seconds looks for the existence of Win-Title called "Finished" or the one called "Rendering".
Don't forget to use SetTitleMatchMode 1 (window's title must start with the specified WinTitle to be a match.)
In this thread you find a timer. Modify it for own purposes.
Re: How to detect when a sub-child window WinTitle changes?
With some help I have built this timer that is pauseable and escapeable. What I am not sure about is: is it possible to use the SetTitleMatchMode in conjunction with this in order to escape the timer?
The window that I'm wanting to watch is a child window and titled as "Rendering to file...". When the rendering is complete, it changes to "Finished in xxxxx seconds...". It's at this point that I would like to escape the timer. Or, better yet, run until the title changes without using a timer at all.
Any thoughts on that? (I'm not sure if AHK detects child windows, so I'm pretty lost here.)
Code: Select all
^+s::running := false ; Ctrl+Shift+s
^!p::Pause ; Ctrl+Alt+p
Sleepy(TimeInSeconds)
{
global running := true
while (TimeInSeconds > 0) && (running)
{
Sleep, 1000
TimeInSeconds += -1
}
}
Any thoughts on that? (I'm not sure if AHK detects child windows, so I'm pretty lost here.)
- divanebaba
- Posts: 804
- Joined: 20 Dec 2016, 03:53
- Location: Diaspora
Re: How to detect when a sub-child window WinTitle changes?
Hello TXShooter.
You write: "I've built this timer ...", but your posted code does not contain a timer, as described in help file.
Help file says: "Causes a subroutine to be launched automatically and repeatedly at a specified time interval."
So a classical timer is just a subroutine. The command SetTimer determines how to trigger this subroutine.
My suggestion was to create a subroutine which checks the existence of determined window titles.
For example:So this is a way, to detect if rendering process has finished. The only delay is the timer repeat time.
How to detect if your buttons are active or not, I don't really know without further information.
Maybe following code could do your job Remark to find the classNN name of the button to check. In example code, Button1 is just a placeholder.
You write: "I've built this timer ...", but your posted code does not contain a timer, as described in help file.
Help file says: "Causes a subroutine to be launched automatically and repeatedly at a specified time interval."
So a classical timer is just a subroutine. The command SetTimer determines how to trigger this subroutine.
My suggestion was to create a subroutine which checks the existence of determined window titles.
For example:
Code: Select all
SetTitleMatchMode, 1 ; Must start with ...
F8::
SetTimer, CheckFinished, 5000
return
CheckFinished:
If !WinExist("Finished in") ; Static part of the the window title: "Finished in xxxx.yyyyyy seconds"
return
SetTimer, CheckFinished, off
; Control, Check,, Button1, Finished in ; Look for classNN name for the button to close message window. Pehaps it could be Button1 or Button[another number]
MsgBox Rendering finished
return
How to detect if your buttons are active or not, I don't really know without further information.
Maybe following code could do your job
Code: Select all
ControlGet, OutputVar, Enabled,, Button1, Rendering to file
Re: How to detect when a sub-child window WinTitle changes? Topic is solved
I just modified my Sleepy timer like so:
This still works in its original fashion just so long as there aren't any other unintentional windows popping up with the title "Finished in", but I can't really see that happening.
Btw, if "Sleep, 1000" isn't a 1 second timer, what is it then?
Code: Select all
^+s::running := false ; Ctrl+Shift+s
^!p::Pause ; Ctrl+Alt+p
Sleepy(TimeInSeconds)
{
SetTitleMatchMode, 1 ; Must start with ...
global running := true
while (TimeInSeconds > 0) && (running) && !WinExist("Finished in")
{
Sleep, 1000
TimeInSeconds += -1
}
}
Btw, if "Sleep, 1000" isn't a 1 second timer, what is it then?
- divanebaba
- Posts: 804
- Joined: 20 Dec 2016, 03:53
- Location: Diaspora
Re: How to detect when a sub-child window WinTitle changes?
Hello.
I've showed you, how to build a timer as described in help-file.
Your type of "timer" or whatever it is, I've never seen.
If your posted code is your whole code, the sleepy()-function is never executed.
I told you what I know. If you want to built your "timer" in a different way, I wish you good luck.
Sleep 1000 is Sleep, DelayInMilliseconds, means it is sleeping a second.
I've showed you, how to build a timer as described in help-file.
Your type of "timer" or whatever it is, I've never seen.
If your posted code is your whole code, the sleepy()-function is never executed.
I told you what I know. If you want to built your "timer" in a different way, I wish you good luck.
Sleep 1000 is Sleep, DelayInMilliseconds, means it is sleeping a second.
Re: How to detect when a sub-child window WinTitle changes?
Sleepy() is a function to replace the command Sleep. It is called with Seconds as its parameter, and is pausable, escapable, and now has Check While functionality.
I only shared it to show how I solved my own request.
I only shared it to show how I solved my own request.
- divanebaba
- Posts: 804
- Joined: 20 Dec 2016, 03:53
- Location: Diaspora
Re: How to detect when a sub-child window WinTitle changes?
Hello TXShooter,
for me it makes no difference, if you use timer, function or something else.
I mean the timer solution, described in help-file, is easy to use and even easy to understand.
And, according to my knowledge, normal timer-solution should achieve desired results.
It is your script and you are free to do what you want.
BTW: A great (maybe greatest) german philosopher said: "You can do what you want, but do not want what you want." [Google translator]
English Wikipedia: "Man can indeed do what he wants, but he cannot will what he wants."
Original by Arthur Schopenhauer: "Du kannst tun, was Du willst, aber nicht wollen, was Du willst."
for me it makes no difference, if you use timer, function or something else.
I mean the timer solution, described in help-file, is easy to use and even easy to understand.
And, according to my knowledge, normal timer-solution should achieve desired results.
It is your script and you are free to do what you want.
BTW: A great (maybe greatest) german philosopher said: "You can do what you want, but do not want what you want." [Google translator]
English Wikipedia: "Man can indeed do what he wants, but he cannot will what he wants."
Original by Arthur Schopenhauer: "Du kannst tun, was Du willst, aber nicht wollen, was Du willst."
Who is online
Users browsing this forum: wilkster and 137 guests