JXA:点击窗口在焦点窗口中

问题描述

使用 Javascript for Automation (JXA) 我想识别用户刚刚点击的窗口。换句话说,我想识别刚刚走到前面的窗口。我该怎么做?

到目前为止,我识别了前端应用程序,并尝试获取焦点所在应用程序的窗口,如下所示:

var frontAppName = Application("System Events").processes.whose({frontmost: {'=': true }})[0].name();  
var frontApp = Application(frontAppName); 
var theCurrentwindow = frontApp.windows[0]

这成功地识别了焦点中的应用程序,但 frontApp.windows[0] 不太正确,因为它与应用程序最初打开的第一个窗口相关联,无论该窗口是否在前面。 (在applescript 中,“window 1”可能会起作用,但我希望有一个 JXA 解决方案。)

因此,如果我在一个应用程序中打开了多个窗口,我需要一种方法来识别我正在单击哪个窗口。我该怎么做?

解决方法

这是 JXA 的已知错误。您可以使用 JXA 代码中的 AppleScript 执行能力来解决问题。以下脚本将返回最前端应用程序的前窗口

(() => {
    'use strict';

    // evalAS :: String -> IO String
    const evalAS = s => {
        const
            a = Application.currentApplication(),sa = (a.includeStandardAdditions = true,a);
        return sa.doShellScript(
            ['osascript -l AppleScript <<OSA_END 2>/dev/null']
            .concat([s])
            .concat('OSA_END')
            .join('\n')
        );
    };

    var frontAppName = Application("System Events").processes.whose({frontmost: {'=': true }})[0].name();  
    var frontApp = Application(frontAppName);
    return evalAS('tell application \"' + frontAppName + '\" to front window');

})();