我的Mac服务会停用前台应用

时间:2011-12-09 01:16:45

标签: macos cocoa

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

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

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

我尝试在服务处理程序中停用我的应用;没运气。隐藏我的应用程序从服务处理程序似乎工作,但只有当用户使用上下文菜单,而不是键组合触发服务,并且只有当我们没有在无停靠模式下运行时(我希望我的应用程序无需对接)

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

1 个答案:

答案 0 :(得分:4)

好的这个问题是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