我在Mac应用程序中编写了一个Cocoa服务。当我在另一个应用程序中并且我触发服务时,即使服务代码完全为空:
- (void)doMyService:(NSPasteboard*)pasteboard
userData:(NSString*)userData
error:(NSString**)error {
}
...该应用程序的窗口已停用,我的窗口被提前。即使我的应用程序设置为在无停靠模式下运行(LSUIElement = false)也是如此。即使我的应用程序没有自己的窗口,前台应用程序的窗口也会被停用!
我尝试在服务处理程序中停用我的应用;没运气。隐藏我的应用程序从服务处理程序似乎工作,但只有当用户使用上下文菜单,而不是键组合触发服务,并且只有当我们没有在无停靠模式下运行时(我希望我的应用程序无需对接)
如何阻止前台应用停用,或者至少能够重新激活它?
答案 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: