Desidero monitorare lo screensaver e gli eventi lockscreen su un box OSX. Come primo passo, sto bene con loro solo stampando sulla console.Monitoraggio eventi salvaschermo in OSX
seguito the advice of another's question, ho scritto qualche Objective C per l'ascolto di cacao notifiche per le com.apple.screensaver.didstart
, com.apple.screensaver.didstop
, com.apple.screenIsLocked
e com.apple.screenIsUnlocked
eventi.
// 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;
}
Si compila bene, ma quando l'eseguo, non mi sembra di osservare tutti gli eventi screensaver (pur avendo il salvaschermo si accende più volte):
% gcc -Wall ScreenSaverMonitor.m ScreenSaverMonitorMain.m -o ScreenSaverMonitor -lobjc -framework Cocoa
% ./ScreenSaverMonitor
running loop (^C to quit)...
^C
%
mio Objective C e Cocoa la conoscenza è molto arrugginita, quindi non sono sicuro se sto usando il framework sbagliato, o se mi sono registrato per gli eventi sbagliati (né dove cercare se sono gli eventi giusti o meno).
Così che cosa è che sto facendo male?
Buona idea! Ho sostituito 'while (1);' con '[[NSRunLoop currentRunLoop] run];', ma ancora nessun dado. – rampion
Non sono sicuro di cosa stai incontrando qui. Ho preso in precedenza il codice modificato, corretto un errore del compilatore e apportato modifiche minori alla registrazione, e sembra funzionare bene per me. Nello specifico, ho modificato la riga #import in #import e ho modificato le istruzioni printf in fprintf in stderr. (Funziona meglio come stderr viene svuotato immediatamente piuttosto che bufferato come printf. –
GoannaGuy
In realtà, la mia versione ottimizzata, che ho consolidato in un unico file sorgente, è disponibile qui: http://pastie.org/8013106 Include una build modificata comando in basso che si costruisce un po 'più veloce, poiché si collega a Foundation.framework invece che al più grande Cocoa.framework (ma dovrebbe funzionare bene) – GoannaGuy