gpt4 book ai didi

objective-c - 在 OSX 10.6+ 中识别当前事件应用程序的 'correct' 方法是什么?

转载 作者:太空狗 更新时间:2023-10-30 03:12:13 26 4
gpt4 key购买 nike

我正在尝试确定哪个 OSX 应用程序当前处于事件状态。我知道在 OSX 10.5 中,这可以通过以下方式完成:

[[NSWorkspace sharedWorkspace] activeApplication]

但是,这在 10.6+ 中已被弃用。

Apple 开发人员文档指出,这应该通过 NSRunningApplication 对象的“事件”属性来完成。我认为解决这个问题的一种方法可能是通过

获取所有正在运行的应用程序的列表
[[NSWorkspace sharedWorkspace] runningApplications]

然后循环检查每个应用程序的“事件”属性。但是,以下测试代码的行为与我预期的不同:从 Terminal.app 编译和运行时,无论我是否选择其他应用程序,只有“终端”应用程序被标记为事件。

#import <Foundation/Foundation.h>
#import <AppKit/NSRunningApplication.h>
#import <AppKit/NSWorkspace.h>

int main(int argc, char *argv[]) {
while(1){
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

NSString *currApp;
NSArray *runningApps;
runningApps = [[NSWorkspace sharedWorkspace] runningApplications];
for (id currApp in runningApps) {
if ([currApp isActive])
NSLog(@"* %@", [currApp localizedName]);
else
NSLog(@" %@", [currApp localizedName]);
}
sleep(1);
[pool release];
}

return 0;
}

我做错了什么?我是否误解了“事件”属性的工作原理?

(此外,请随意批评我的 Objective C 代码——这是我第一次尝试使用 Objective C,所以我知道对于受过训练的人来说它可能丑陋得可怕!请原谅我!:) 欢迎提出任何建议.)

最佳答案

您的问题是您的应用程序无法从系统接收任何通知它当前应用程序已更改的事件,因此它永远不会更新 NSRunningApplication 实例上的事件属性。如果我使用完全相同的代码,但当我开始运行该代码时另一个应用程序处于事件状态,它会报告该应用程序。

如果改为更改代码以运行主线程的 NSRunLoop 并使用 1 秒计时器,它应该可以工作。

这是一个简单的例子:

#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>

@interface Foo : NSObject
- (void)run;
@end

@implementation Foo
- (void)run {
for (NSRunningApplication *currApp in [[NSWorkspace sharedWorkspace] runningApplications]) {
if ([currApp isActive]) {
NSLog(@"* %@", [currApp localizedName]);
} else {
NSLog(@" %@", [currApp localizedName]);
}
}
NSLog(@"---");
}
@end

int main(int argc, char *argv[]) {
NSAutoreleasePool *p = [NSAutoreleasePool new];

Foo *foo = [[Foo new] autorelease];
NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0f
target:foo
selector:@selector(run)
userInfo:nil
repeats:YES];
[[NSRunLoop mainRunLoop] run];

[p release];
}

关于objective-c - 在 OSX 10.6+ 中识别当前事件应用程序的 'correct' 方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8348627/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com