Приложение NSTask теряет фокус

Я использую NSTask для запуска внешнего приложения. Но в это время мое приложение теряет фокус. Я не хочу этого. Другое приложение просто записывает некоторую информацию в файл, а мое приложение читает и отображает эту информацию. Возможно ли запустить приложение NSTask в фоновом режиме?


person Lupurus    schedule 13.02.2013    source источник
comment
Вы можете написать процесс демона, так как кажется, что это другое приложение должно быть безголовым.   -  person CodaFi    schedule 13.02.2013


Ответы (3)


Если вы запускаете приложение с помощью команды open (справочная страница), вы можете попробовать использовать параметр -g, чтобы приложение не отображалось на переднем плане:

-g  Do not bring the application to the foreground.

Поэтому вместо того, чтобы заставлять NSTask запускать приложение напрямую; используйте open, чтобы открыть его.

person trojanfoe    schedule 13.02.2013
comment
Хм, в моем случае это не работает, потому что внешнее приложение открывает второе окно, и с этого момента мое приложение снова теряет фокус. - person Lupurus; 13.02.2013
comment
@Lupurus Итак, при использовании open -g начальное окно внешнего приложения находится в фоновом режиме, но через некоторое время открывается новое окно, которое получает фокус? - person trojanfoe; 13.02.2013
comment
Хм, я не знаю, где именно проблема. Возможно, лучшее объяснение: внешнее приложение — это приложение, которое я создал с помощью Wineskin. Он использует XQuartz для отображения окон. .exe, который я запускаю таким образом, создает свернутое окно, которое также свернуто в доке. Я попытался вызвать open -g ... из терминала, но он просто открывает новое окно терминала, в котором приложение для вина и терминал теряет фокус - person Lupurus; 13.02.2013
comment
@Lupurus Звучит как проигрышная битва; Я не думаю, что это возможно без большего контроля над внешним приложением. Если вы написали это, то, возможно, вырезали нужные вам биты и поместили их в библиотеку, которую можно связать с обоими приложениями? - person trojanfoe; 13.02.2013
comment
Хорошо... может быть, я смогу найти что-нибудь в коде Wineskin. Спасибо! - person Lupurus; 13.02.2013
comment
Я понял. Я нашел что-то вроде BringToFront в исходном коде Wineskin. Я прокомментировал это, и теперь это работает. Спасибо! - person Lupurus; 13.02.2013

Я думаю, что вместо использования NSTask вы можете использовать NSWorkspace launchApplicationAtURL:options:configuration:error:. Если вы передаете NSWorkspaceLaunchWithoutAddingToRecents | NSWorkspaceLaunchWithoutActivation | NSWorkspaceLaunchAndHide в качестве аргумента options:, он должен быть фактически невидимым. (Я, очевидно, не пробовал это с вашим конкретным случаем, но так оно и должно работать.)

person Chuck    schedule 13.02.2013

Почему бы просто не вызвать «performSelector:withObject:afterDelay» после запуска NSTask? Используя это, вы можете после соответствующей задержки вызвать селектор, который повторно активирует ваше приложение. Здесь вам не нужно ничего особенного, просто позвольте другому приложению выйти на передний план, а затем повторно активируйте свое собственное приложение.

Это сработает. Просто установите задержку на то, что необходимо.

[[NSRunningApplication currentApplication] performSelector:@selector(activateWithOptions:) withObject:[NSNumber numberWithUnsignedInteger:NSApplicationActivateIgnoringOtherApps] afterDelay:5.0];
person regulus6633    schedule 13.02.2013
comment
Спасибо. Раньше у меня было похожее решение, но оно не очень полезно: если я переключусь на другое запущенное приложение (возможно, Safari, Mail и т. д.), этот код также активирует мое приложение... - person Lupurus; 14.02.2013