gpt4 book ai didi

objective-c - 在 OSX 中监视屏幕保护程序事件

转载 作者:太空狗 更新时间:2023-10-30 03:20:19 27 4
gpt4 key购买 nike

我想监控 OSX 机器上的屏幕保护程序和锁屏事件。作为第一步,我同意他们只打印到控制台。

正在关注 the advice of another's question ,我写了一些 Objective C 来监听 Co​​coa 通知com.apple.screensaver.didstartcom.apple.screensaver.didstopcom.apple.screenIsLockedcom.apple .screenIsUnlocked 事件。

// ScreenSaverMonitor.h
#import <Foundation/NSObject.h>
#import <Foundation/NSNotification.h>

@interface ScreenSaverMonitor: NSObject {}
-(id) init;
-(void) receive: (NSNotification*) notification;
@end

// ScreenSaverMonitor.m
#import "ScreenSaverMonitor.h"
#import <Foundation/NSString.h>
#import <Foundation/NSDistributedNotificationCenter.h>
#import <Foundation/NSRunLoop.h>
#import <stdio.h>

@implementation ScreenSaverMonitor
-(id) init {
NSDistributedNotificationCenter * center
= [NSDistributedNotificationCenter defaultCenter];

[center addObserver: self
selector: @selector(receive:)
name: @"com.apple.screensaver.didstart"
object: nil
];
[center addObserver: self
selector: @selector(receive:)
name: @"com.apple.screensaver.didstop"
object: nil
];
[center addObserver: self
selector: @selector(receive:)
name: @"com.apple.screenIsLocked"
object: nil
];
[center addObserver: self
selector: @selector(receive:)
name: @"com.apple.screenIsUnlocked"
object: nil
];
printf("running loop... (^C to quit)");
[[NSRunLoop currentRunLoop] run];
printf("...ending loop");
return self;
}
-(void) receive: (NSNotification*) notification {
printf("%s\n", [[notification name] UTF8String] );
}
@end

// ScreenSaverMonitorMain.m
#import "ScreenSaverMonitor.h"

int main( int argc, char ** argv) {
[[ScreenSaverMonitor alloc] init];
return 0;
}

它编译得很好,但是当我运行它时,我似乎没有观察到任何屏幕保护程序事件(尽管屏幕保护程序多次出现):

% gcc -Wall ScreenSaverMonitor.m ScreenSaverMonitorMain.m -o ScreenSaverMonitor -lobjc -framework Cocoa
% ./ScreenSaverMonitor
running loop (^C to quit)...
^C
%

我的 Objective C 和 Cocoa 知识很生疏,所以我不确定我是否使用了错误的框架,或者我是否注册了错误的事件(也不知道在哪里可以查明这些是否是正确的事件与否)。

那么我做错了什么?

最佳答案

您已经评论了您的问题。

while(1); // busy wait's bad, I know, but easy to implement

以上几乎总是一个坏主意。

NSDistributedNotificationCenter实际上需要一个正在运行的主线程NSRunLoop来运行。

http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Notifications/Articles/NotificationCenters.html#//apple_ref/doc/uid/20000216-BAJGDAFC

在 OS X 上从命令行应用程序的 main() 创建和旋转运行循环是一件相当简单的事情。快速搜索即可找到大量示例。

关于objective-c - 在 OSX 中监视屏幕保护程序事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16944434/

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