我想从OS X的cmd + tab菜单中获取应用程序。我现在最好的方法是将其与AppleScript调用关联,并具有以下内容:

NSDictionary *errorDict;
NSAppleEventDescriptor *returnValue;
NSString *appleScriptText = @"tell application \"System Events\" to get name of (processes where background only is false)";
NSAppleScript *script = [[NSAppleScript alloc] initWithSource:appleScriptText];


然后遍历从中返回的内容,并将其与[[NSWorkspace sharedWorkspace] runningApplications]匹配,但这似乎有点怪异,无法完成此任务。

所以我在这里的问题是:有没有一种方法不像这个方法那么古怪?

我真的很紧张的答案。

最佳答案

鉴于您已经熟悉-[NSWorkspace runningApplications],为什么不遍历那些内容并检查哪些符合条件? background only属性对应于NSRunningApplicationactivationPolicy属性,而不是NSApplicationActivationPolicyRegular

因此,类似(未经测试)的内容:

NSArray* apps = [[NSWorkspace sharedWorkspace] runningApplications];
NSIndexSet* indexes = [apps indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop){
    return [obj activationPolicy] == NSApplicationActivationPolicyRegular;
}];
NSArray* names = [[apps objectsAtIndexes:indexes] valueForKey:@"localizedName"];

08-05 22:36