Activating an Application in Applescript with the Application as a Variable

15,707

Your script works for me. Activating an application with a string variable has always worked in any version of OSX... so you have some different problem happening. The problem is not in the code you are showing.

Although your code works, you can shorten your getCurrentApp() subroutine like this...

set currentApp to my getCurrentApp()
activate application "Safari"
delay 1
activate application currentApp

to getCurrentApp()
    return (path to frontmost application as text)
end getCurrentApp

You really don't even need "as text" in the subroutine if you also remove "application" from the activate line...

set currentApp to my getCurrentApp()
activate application "Safari"
delay 1
activate currentApp

to getCurrentApp()
    return (path to frontmost application)
end getCurrentApp

So after all is said and done, your code could look like this...

set currentApp to path to frontmost application
activate application "Safari"
delay 1
activate currentApp

EDIT: Sometimes when you try to get the frontmost application, the applescript that you are running is the frontmost application instead of the app you think is frontmost. It's very hard to detect when this happens but I suspect this may be happening to you. So here's a subroutine that I use the get the frontmost app. This ensures that the applescript is not returned as the frontmost app. Give it a try and see if it helps...

on getFrontAppPath()
    set frontAppPath to (path to frontmost application) as text
    set myPath to (path to me) as text

    if frontAppPath is myPath then
        try
            tell application "Finder" to set bundleID to id of file myPath
            tell application "System Events" to set visible of (first process whose bundle identifier is bundleID) to false

            -- we need to delay because it takes time for the process to hide
            -- I noticed this when running the code as an application from the applescript menu bar item
            set inTime to current date
            repeat
                set frontAppPath to (path to frontmost application) as text
                if frontAppPath is not myPath then exit repeat
                if (current date) - inTime is greater than 2 then exit repeat
            end repeat
        end try
    end if
    return frontAppPath
end getFrontAppPath
Share:
15,707

Related videos on Youtube

SwiftMatt
Author by

SwiftMatt

Updated on September 15, 2022

Comments

  • SwiftMatt
    SwiftMatt over 1 year

    I'm trying to write a script that logs the current app, switches to another app, does some task, and comes back to the original app. This is what I have

    set currentApp to my getCurrentApp()
    activate application "Safari"
    # Some task
    activate application currentApp
    
    to getCurrentApp()
    set front_app to (path to frontmost application as Unicode text)
    set AppleScript's text item delimiters to ":"
    set front_app to front_app's text items
    set AppleScript's text item delimiters to {""} --> restore delimiters to default value
    set item_num to (count of front_app) - 1
    set app_name to item item_num of front_app
    set AppleScript's text item delimiters to "."
    set app_name to app_name's text items
    set AppleScript's text item delimiters to {""} --> restore delimiters to default value
    set MyApp to item 1 of app_name
    return MyApp
    end getCurrentApp
    

    The weird thing is that the activate application command works if you type in a string literal, but if you pass it a string variable, it will not activate the application. Any ideas why?