关闭后,从另一个应用程序打开Spotify主窗口

时间:2013-06-08 23:10:40

标签: cocoa spotify

我正在尝试扩展一些Spotify功能(而不是其他客户端)的应用程序。当我在Dock上点击我的图标时,我想显示Spotify的主窗口 - 即使Spotify中的主窗口已关闭。

这是我现在的代码:

- (void) applicationDidBecomeActive:(NSNotification *)notification {
// Causes Spotify to hit the front when selecting it!
[[[NSRunningApplication
   runningApplicationsWithBundleIdentifier:@"com.spotify.client"] lastObject]
 activateWithOptions:NSApplicationActivateAllWindows];
}

当窗口打开但不在焦点(背景)时它起作用,但在关闭Spotify主窗口时(我常常会这样做),它不起作用。如果它从另一个应用程序关闭,有没有办法重新打开这个窗口?

Spotify图标可以做到这一点(显然)。尝试按下关闭按钮(红色x)并按下图标(它将重新出现)。这可能是从另一个应用程序?

1 个答案:

答案 0 :(得分:0)

Dock将reopen Apple事件发送到您单击的应用程序,然后按其认为合适的方式执行代码。要模拟Dock单击,您需要手动将reopen事件发送到应用程序。

Apple Documentation on the matter表示reopen事件的ID为rapp代码(kAEReopenApplication)且属于kCoreEventClass类。

从那里开始,在代码中构建Apple Event并将其发送到应用程序相对简单。请注意,您确实应该从AESendMessage调用执行一些错误检查,因为如果应用程序未启动,事件可能会失败等等 - 我还没有真正测试过这些情况。

这是我的解决方案。请注意,您需要保留原始代码以将应用程序置于最前面 - Apple Event不会更改应用程序顺序。

NSAppleEventDescriptor *target = [[NSAppleEventDescriptor alloc]
                                    initWithDescriptorType:typeApplicationBundleID
                                                      data:[@"com.spotify.client" dataUsingEncoding:NSUTF8StringEncoding]];

NSAppleEventDescriptor *event = [[NSAppleEventDescriptor alloc]
                                   initWithEventClass:kCoreEventClass
                                              eventID:kAEReopenApplication
                                     targetDescriptor:target
                                             returnID:kAutoGenerateReturnID
                                        transactionID:kAnyTransactionID];

AESendMessage(event.aeDesc, NULL, kAEWaitReply | kAENeverInteract, kAEDefaultTimeout);