我想監視OSX框上的屏幕保護程序和鎖定屏幕事件。作爲第一遍,我很好,他們只是打印到控制檯。在OSX中監視屏幕保護程序事件
繼the advice of another's question,我寫了一些目標C監聽可可通知的 com.apple.screensaver.didstart
,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
%
我的目標C和Cocoa知識是非常生疏的,所以我不確定我是否錯誤地使用了框架,或者如果我註冊了錯誤的事件(也不知道在哪裏查找是否是正確的事件)。
那麼我在做什麼錯了?
好主意!我用'[[NSRunLoop currentRunLoop] run]'替換了'while(1);',但仍然沒有骰子。 – rampion
我不確定你在這裏遇到什麼。我已經採取了上面的編輯代碼,修復了一個編譯器錯誤,並做了輕微的日誌記錄更改,並且它對我來說似乎工作正常。具體來說,我將#import行更改爲#import ,並將printf語句更改爲fprintf stderr。 (這個效果更好,因爲stderr是立即刷新的,而不是像printf那樣緩衝。 –
GoannaGuy
實際上,我整理到單個源文件中的我的調整版本可以在這裏找到:http://pastie.org/8013106它包含一個修改後的版本命令在底部建立一點快,因爲它鏈接到Foundation.framework而不是較大的Cocoa.framework(但任一個都應該可以正常工作) – GoannaGuy