Ich möchte Bildschirmschoner und Lockscreen-Ereignisse auf einer OSX-Box überwachen. Als ersten Durchlauf bin ich damit einverstanden, dass sie nur auf die Konsole drucken.Überwachung Bildschirmschoner Ereignisse in OSX
the advice of another's question Folgen, schrieb ich einige Objective C für Cocoa Benachrichtigungen zu hören für die com.apple.screensaver.didstart
, com.apple.screensaver.didstop
, com.apple.screenIsLocked
und com.apple.screenIsUnlocked
Veranstaltungen.
// 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;
}
Es kompiliert gut, aber wenn ich es laufen, ich scheine keine Bildschirmschoner Ereignisse zu beobachten (trotz der auf sie mehrmals kommen Bildschirmschoner mit):
% gcc -Wall ScreenSaverMonitor.m ScreenSaverMonitorMain.m -o ScreenSaverMonitor -lobjc -framework Cocoa
% ./ScreenSaverMonitor
running loop (^C to quit)...
^C
%
Meine Objective-C und Cocoa Wissen ist sehr rostig, daher bin ich mir nicht sicher, ob ich das Framework falsch verwende oder ob ich mich für die falschen Ereignisse registriert habe (und auch nicht, wo ich nachsehen muss, ob das die richtigen Ereignisse sind oder nicht).
Also was mache ich falsch?
Gute Idee! Ich habe 'while (1);' durch '[[NSRunLoop currentRunLoop] run];' ersetzt, aber immer noch keine Würfel. – rampion
Ich bin mir nicht sicher, worauf Sie hier stoßen. Ich habe Ihren bearbeiteten Code oben genommen, einen Compiler-Fehler behoben und geringfügige Protokollierungsänderungen vorgenommen, und es scheint mir gut zu funktionieren. Insbesondere habe ich die Zeile #import in #import geändert und die printf-Anweisungen in fprintf in stderr geändert. (Dies funktioniert besser, da stderr sofort geleert und nicht gepuffert wird wie printf. –
GoannaGuy
Meine optimierte Version, die ich in einer einzigen Quelldatei zusammenfasste, ist hier verfügbar: http://pastie.org/8013106 Sie enthält einen modifizierten Build Befehl an der Unterseite, die ein bisschen schneller baut, da es gegen Foundation.framework statt der größeren Cocoa.framework linken (aber sollte entweder gut funktionieren) – GoannaGuy