I’m trying to write a script that can control different windows from different programs (set position and size). I’ve got things just about working but I’m having problem accurately identifying windows. Right now I’ve got:
tell application "System Events"
tell application "Mail"
set windowName to name of window 1
end tell
end tell
This is a pretty simplified version of what I have working now. I’m grabbing the window information for many different applications and storing them as properties which are being called upon by another script later:
tell application "System Events"
tell application "Mail"
set position of window windowName to valueX
end tell
end tell
This works as long as the name of the window doesn’t change. In many other applications I have no problems because window titles don’t change (iCal, iChat, etc). In Mail the window title changes depending on how many e-mails are in your e-mail box. If an e-mail comes in between the first part of the script and the last then the script fails.
I can’t really refer to the window by it’s index number because those change as the order of the windows change (front to back). I thought maybe the window ID would work, but I need my script to work even if an application has been quit and restarted and the ID number changes if the application is relaunched. Am I SOL, or is there something I hadn’t thought of?
Not SOL, but you’ll have to do a little more work. There’s only a few types of windows. You have the main browser window and you have email messages, whether it be a draft they are composing or an email message they’re reading. Maybe you’re concerned with the preferences window too. So you have to store the type of window. If it’s a browser then you also will have to store the currently selected message. If it’s an email window then you store the message id too. For browsers you just open a new browser window and restore the selection. For email messages you just open the messages. You’ll have to check Mail’s dictionary for other types of windows, but the idea will be the same.