2009-09-24 1 views
4

Как я могу завершить другое приложение, работающее в cooca. Предположим, что у меня работает iTunes, и я набираю quit в своем приложении, это прекратит itunes. «iTunes» - всего лишь пример, он может быть любым, чего хочет пользователь. Я могу открыть любое приложение из своего приложения, но я хочу знать, как закрыть любое приложение.Завершение работы другого приложения - Cocoa

благодаря

Кевин

ответ

9

Если вы используете Mac OS X 10.6, Snow Leopard, вы можете использовать новый метод NSRunningApplication terminate.

+0

хорошо, я получаю эту ошибку при отладке вот мой код NSRunningApplication * selectedApp = APPNAME; \t \t [selectedApp terminate]; – lab12

+2

Возможно, вы хотите вызвать [[[NSRunningApplication runningApplicationsWithBundleIdentifier: @ "com.apple.iTunes"] objectAtIndex: 0] terminate]. Вы не можете назначить j. случайная строковая константа к переменной совершенно другого класса. – cdespinosa

1

Для приложений высокого уровня, таких как ITunes, на основе углерода или какао, они будут реагировать на Applescript. «Выход» - часть стандартного пакета. Вам просто необходимо отправить:

tell application "iTunes" to quit 

Существует много способов сделать это. Проще реализовать, чтобы сделать системный вызов osascript:

osascript -e 'tell application "iTunes" to quit' 

Вы можете пойти оттуда более мощные инструменты, такие как Apple Events, что было бы очень уместно для этой проблемы. Вы даже можете зайти так далеко, как Scripting Bridge, но для завершения приложения это будет излишним.

Это будет работать только для программ, которые отвечают на Applescript, но это должна быть любая программа, которую вы увидите на доке (и которую я подразумеваю под «приложениями»). Для процессов нижнего уровня, таких как демоны, вам нужны другие методы, такие как launchctl или kill, но мы можем поговорить о них, если они вам понадобятся.

11

AppleScript - это довольно высокоуровневый способ отправить одно событие Quit. SIGTERM - довольно грубая, низкоуровневая.

Правильный способ бросить другое приложение, чтобы получить его Process серийный номер (PSN) и отправить его событие kAEQuitApplication Apple, с этими двумя строками кода:

result = AEBuildAppleEvent(kCoreEventClass, kAEQuitApplication, typeProcessSerialNumber, &currentProcessPSN, 
sizeof(ProcessSerialNumber), kAutoGenerateReturnID, kAnyTransactionID, &tAppleEvent, &tAEBuildError,""); 
result = AESend(&tAppleEvent, &tReply, kAEAlwaysInteract+kAENoReply, kAENormalPriority, kNoTimeOut, nil, nil);   

Вы можете сделать это из C, C++ , или Objective-C, и вам нужно установить связь с CoreServices.framework.

+1

AESend, кажется, не существует, AESendMessage действительно существует, однако – valexa

 Смежные вопросы

  • Нет связанных вопросов^_^