【问题标题】:My Mac Service deactivates the foreground app我的 Mac 服务停用前台应用程序
【发布时间】:2012-07-19 08:36:31
【问题描述】:

我在 Mac 应用程序中编写了一个 Cocoa 服务。当我在另一个应用程序中并触发服务时,即使服务代码完全为空:

- (void)doMyService:(NSPasteboard*)pasteboard
        userData:(NSString*)userData 
        error:(NSString**)error {
}

...该应用程序的窗口已停用,而我的窗口已提前。即使我的应用程序设置为在无停靠模式下运行 (LSUIElement = false),也是如此。即使我的应用程序没有自己的窗口,前台应用程序的窗口也会被停用!

我尝试在服务处理程序中停用我的应用程序;没运气。从服务处理程序中隐藏我的应用程序似乎有效,但前提是用户使用上下文菜单触发服务,而不是组合键,并且仅当我们没有在无坞模式下运行(我希望我的应用程序是无坞的) .

如何防止前台应用停用,或者至少能够重新激活它?

【问题讨论】:

  • 在您的服务的 plist 文件中将“应用程序仅在后台”设置为是。
  • 你们的服务是做什么的?它完成任务后会退出吗?
  • @parag 感谢您的建议,但它似乎没有效果。
  • @RobKeniger 它正在获取服务抓取的文本并将其发送到 Web api。我不希望它每次都退出,因为我们还有一个我想保留的状态栏图标/菜单。在正常操作中,只需一个 Growl 通知就足够了;我根本不需要我的应用程序。有时我可能需要弹出一个窗口,以便用户可以登录到 web api,但即便如此,我也希望能够在窗口关闭后返回到以前的应用程序。

标签: macos cocoa


【解决方案1】:

好的,这个问题已经 6 个月大了,所以你现在可能已经解决了你的问题,但万一这有用...

我通过 NSWorkspace 观察应用程序停用情况,解决了我正在开发的应用程序的类似问题。

你可以拥有一个属性:

NSRunningApplication* _previousRunningApplication;

并通过观察 NSWorkspaceDidDeactivateApplicationNotification 更新此属性

[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self
                                                       selector:@selector(anyApplicationDeactivated:)
                                                           name:NSWorkspaceDidDeactivateApplicationNotification
                                                         object:nil];


// Called when any running application deactivates
-(void)anyApplicationDeactivated:(NSNotification*) notification {
    NSRunningApplication* app = [notification.userInfo valueForKey:NSWorkspaceApplicationKey];
    _previousRunningApplication = app;
}

然后,当您的应用完成执行后,只需使用以下命令激活之前处于活动状态的应用:

// Activate the previously active application (if available)
[_previousRunningApplication activateWithOptions:0];

如果有可能在您的应用处于活动状态时调用最后一行,那么它应该首先检查它是否使用[NSApp isActive](或者您可能会触发一些令人惊讶和烦人的事情,用户行为...)

如果你找到了一个更简单的解决方案,我很想知道。

如果这段代码对任何人都有用,我创建了一个单独的类来处理这一切并将其签入 Github:

http://github.com/mjrit/MJRAppReactivation

【讨论】:

  • 我实际上已经继续前进了,但是感谢您的回答!似乎有人对这个问题感兴趣,所以希望它能帮助下一个人避免一些头疼的事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-11
  • 2014-12-13
相关资源
最近更新 更多