使用cocoa控制另一个应用程序

使用cocoa控制另一个应用程序,cocoa,controls,terminal,Cocoa,Controls,Terminal,我有一个应用程序,它使用 NSString *systemRun = [[NSString alloc] init]; systemRun = [systemRun stringByAppendingFormat:@"open -a Terminal %@", executable]; system([systemRun UTF8String]); 现在,我想在我的GUI上放置一个“结束”按钮,它将关闭终端。但是,在使用NSRunningApplication stuff终止它之前,我需要让终

我有一个应用程序,它使用

NSString *systemRun = [[NSString alloc] init];
systemRun = [systemRun stringByAppendingFormat:@"open -a Terminal %@", executable];
system([systemRun UTF8String]);
现在,我想在我的GUI上放置一个“结束”按钮,它将关闭终端。但是,在使用NSRunningApplication stuff终止它之前,我需要让终端会话注销,这样它就不会向用户提示登录进程仍在运行的警告。我认为只需将窗口类型设置为“logout”和一个返回字符是最简单的。我知道我可以用AppleScript做到这一点,但AppleScript能做Cocoa做不到的事情似乎很奇怪。我错过什么了吗?

停下来

如果用户可能已经在您的程序使用该应用程序的上下文之外使用了该应用程序,则决不应让另一个应用程序退出

如果您的用户已经打开了一个终端窗口并正在执行某些操作,那么当您的程序试图终止terminal.app时,它将对此进行干扰。如果用户将Terminal.app配置为在关闭仅运行登录进程和shell的会话之前不提示,那么您将在没有警告的情况下终止用户的所有ssh会话

(如果您的文字处理器告诉您的web浏览器显示一个页面,然后在关闭该页面时关闭所有浏览器会话,您会怎么想?)

至少,使用
open-n-W-a
,但如果可能,根本不要使用终端,只需将可执行文件的stdout通过管道传输到NSTextView即可。如果您的可执行文件需要与用户进行交互,那么考虑使用<代码> xTale进程,该进程将在进程结束时自行终止。

< Prime> Go!<强>

你应该把自己当成你电脑的上帝。不幸的是,恶毒的人用酒吧包围了我们。AppleScript不向接收程序发送objective-C消息。它发送收件人同意解释和执行的事件

请参阅OSX分布式对象体系结构,使用NSDistantObject、NISPocation、NSConnection、NSPortMessage、NSPort将消息从客户端进程传输到服务器进程。我还没有走过这条路


请参阅手册。

同时,使用
forceTerminate
方法而不是
terminate
可以很好地工作,但是关于如何执行此操作的一般答案仍将非常感谢,并对我的应用程序的其余部分非常有帮助。继续!你应该把自己当成你电脑的神。不幸的是,恶毒的人用酒吧包围了我们。AppleScript不向接收程序发送objective-C消息。它发送收件人同意解释和执行的事件。调试器和名为“Instruments”的程序证明了这样的事情是可以做到的。我倾向于认为接收程序必须在调用者的堆中执行。同时运行一个程序的多个副本从来不是苹果的方式。谁拥有我的电脑?啊,xterm是个好主意。不幸的是,我制作了这个很棒的GUI包装来运行可执行文件,但我不得不放弃这个想法,因为经常会出现一些缓冲和编码问题。谢谢你的建议