Tôi muốn theo dõi bảo vệ màn hình và các sự kiện trên màn hình khóa trên hộp OSX. Như một lần đầu tiên, tôi tốt với họ chỉ in đến bàn điều khiển.Giám sát Trình bảo vệ màn hình Sự kiện trong OSX
Sau the advice of another's question, tôi đã viết một số C Mục tiêu để nghe cho Cocoa Notifications cho com.apple.screensaver.didstart
, com.apple.screensaver.didstop
, com.apple.screenIsLocked
, và com.apple.screenIsUnlocked
sự kiện.
// 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;
}
Nó biên dịch tốt, nhưng khi tôi chạy nó, tôi dường như không quan sát bất kỳ sự kiện bảo vệ màn hình (mặc dù có bảo vệ màn hình đến trên nhiều lần):
% gcc -Wall ScreenSaverMonitor.m ScreenSaverMonitorMain.m -o ScreenSaverMonitor -lobjc -framework Cocoa
% ./ScreenSaverMonitor
running loop (^C to quit)...
^C
%
C Mục tiêu của tôi và Cocoa kiến thức là rất gỉ, vì vậy tôi không chắc chắn nếu tôi đang sử dụng khuôn khổ sai, hoặc nếu tôi đã đăng ký cho các sự kiện sai (cũng không phải nơi để xem xét để tìm ra cho dù đó là những sự kiện đúng hay không).
Vì vậy, tôi đang làm gì sai?
Ý tưởng hay! Tôi thay thế 'while (1);' với '[[NSRunLoop currentRunLoop] chạy];', nhưng vẫn không có con xúc xắc. – rampion
Tôi không chắc chắn những gì bạn đang chạy vào đây. Tôi đã lấy mã đã chỉnh sửa của bạn ở trên, đã sửa lỗi trình biên dịch và thực hiện thay đổi nhật ký nhỏ và có vẻ như nó hoạt động tốt cho tôi. Cụ thể, tôi đã thay đổi dòng #import thành #import và thay đổi các lệnh printf thành fprintf thành stderr. (Điều này hoạt động tốt hơn khi stderr được flushed ngay lập tức thay vì buffered như printf là. –
GoannaGuy
Thực ra, phiên bản tinh chỉnh của tôi, mà tôi hợp nhất thành một tệp nguồn duy nhất, có sẵn ở đây: http://pastie.org/8013106 Nó bao gồm một bản sửa đổi lệnh ở phía dưới mà xây dựng một chút nhanh hơn, kể từ khi nó liên kết với Foundation.framework thay vì Cocoa.framework lớn hơn (nhưng hoặc là nên làm việc tốt) – GoannaGuy