【问题标题】:How to send event or message to external process in Mac?如何在 Mac 中向外部进程发送事件或消息?
【发布时间】:2012-06-19 10:01:10
【问题描述】:

在 Windows 中,我可以将自定义消息发布到另一个进程并通知它执行如下操作:

PostMessage(WindowOfAnyProcess, WM_CUSTOM_MESSAGE, param1, param2)

Mac OS 上的替代方案是什么?碳事件对我有帮助吗?如何? 谢谢。

【问题讨论】:

  • 我不知道这些对我有没有帮助,我不想使用基于网络的解决方案或需要一些配置或需要 sudo 命令和...,也许我应该使用共享内存方法。
  • 您是否正在使用您正在创建的另一个应用程序?或者您想与第三方应用通话?
  • 这两个应用程序都是我的。不是第三方。

标签: macos cocoa macos-carbon postmessage


【解决方案1】:

假设这两个进程都是你的,你可以使用NSDistributedNotificationCenter向每个进程发送通知和数据。

为此,请执行以下操作:

[[NSDistributedNotificationCenter defaultCenter] postNotificationName:@"HelloFromProcessOne" object:nil]

如果你想包含数据,你可以使用:

[[NSDistributedNotificationCenter defaultCenter] postNotificationName:@"HelloFromProcessOne" object:nil userInfo:[NSDictionary dictionaryWithObject:@"some info here" forKey:@"data"]]

应添加注释: 只有在不包含字典的情况下,沙盒应用程序才能发送通知。如果发送应用程序在 App Sandbox 中,notificationInfo 必须是 nil。这意味着如果您打算定位 Mac AppStore,您将无法在通知中提供信息。

要让应用程序接收通知,请执行以下操作:

[[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(someNotificationUpdate:) name:@"HelloFromProcessOne" object:nil]

someNotificationUpdate: 将被声明为:

- (void)someNotificationUpdate:(NSNotification *)note;

【讨论】:

  • 感谢您的回答,哪个进程收到通知? postNotificationName 中未指定目标进程 ID。和目标进程如何收到这个通知?
  • 通知将被发送到任何注册自己以接收它们的对象(在任何进程中)。您可以指定对象,但我发现使用 nil 更容易。我更新了上面的代码以显示如何接收通知。
  • 这种通知是“系统范围的”;一个对象发布,零个或多个对象听。它不像 Windows 中的一对一管道。它更像是广播。还有一个 NSNoticationCenter 类可以做同样的事情,但只在你的应用程序中(没有进程间通信)
  • 感谢您的帮助。
  • 谢谢,非常有帮助。但是是否有任何替代方案(NSDistributedNotificationCenter)允许从沙盒应用程序发送带有字典的通知。
猜你喜欢
  • 1970-01-01
  • 2021-11-08
  • 2018-07-02
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 2022-10-18
  • 2016-08-09
相关资源
最近更新 更多