Почему я могу получить доступ только к window.properties () при запуске из Automator? - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь написать JXA-скрипт, который расширяет границы текущего окна текущего приложения по вертикали, чтобы оно доходило от верха до низа экрана.Если я запускаю следующий скрипт в Automator как быстрое действие «Запуск JavaScript», оно работает:

var app = Application.currentApplication();
var window = app.windows[0];
var orig_bounds = window.properties().bounds;
var vertical_res =
    Application("Finder").desktop.window.properties().bounds.height;

window.bounds = {
    "x": orig_bounds.x,
    "y": 0,
    "width": orig_bounds.width,
    "height": vertical_res
};

Я хочу, чтобы этот скрипт был привязан к горячей клавише.Когда я связываю его в «Системные настройки» -> «Клавиатура» -> «Горячие клавиши» -> «Службы» -> «Общие» и пытаюсь активировать его, когда какое-то приложение активно (например, iTerm 2), оно не работает, и я получаю сообщение об ошибке:

The action “Run JavaScript” encountered an error: “Error on line 4: TypeError: undefined is not an object (evaluating 'window.properties')”

Обратите внимание: если я изменю скрипт, чтобы он всегда работал с определенным приложением (var app = Application("Google Chrome");), и запустил его в Automator, он будет работать.

1 Ответ

0 голосов
/ 17 июля 2019

Вам необходимо получить приложение, которое используется в данный момент (самое переднее приложение), поскольку текущее приложение - это приложение, выполняющее код Javascript. Вот почему код работает, когда он запускается в Automator и когда определенное приложение жестко запрограммировано.

Чтобы использовать приложение, вы можете использовать две строки ниже:

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

Я не могу быть уверен в ошибке, но понимаю, что обычно рекомендуется включать Стандартные определения, и я включил ее в пересмотренный код ниже, который не вызывает эту ошибку при использовании горячей комбинация клавиш.

function run(input, parameters) {
	
	var app = Application.currentApplication();
	app.includeStandardAdditions = true;
	
	var frontAppName = Application("System Events").processes.whose({frontmost: {'=': true }})[0].name();
	var frontApp = Application(frontAppName);

	var window = frontApp.windows[0];
	var orig_bounds = window.properties().bounds;
	var vertical_res = Application("Finder").desktop.window.properties().bounds.height;
		
	var orig_x = orig_bounds.x;
	var orig_width = orig_bounds.width;
	
	frontApp.windows[0].bounds = {
    	x: orig_x,
    	y: 0,
    	width: orig_width,
    	height: vertical_res
	};
}
...