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