问题描述
使用 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');
})();