OSX ボックスでスクリーンセーバーとロック画面のイベントを監視したいと考えています。最初のパスとして、コンソールに出力するだけで問題ありません。
別の質問のアドバイスに従って、、、、、およびイベントのCocoa 通知com.apple.screensaver.didstart
をリッスンする目的の C を書きました
。com.apple.screensaver.didstop
com.apple.screenIsLocked
com.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 の知識は非常にさびしいので、フレームワークの使い方が間違っているのか、それとも間違ったイベントに登録したのか (また、それらが正しいイベントであるか、またはいいえ)。
それで、私が間違っているのは何ですか?