监视OSX中的屏幕保护程序事件 [英] Monitoring Screensaver Events in OSX

查看:320
本文介绍了监视OSX中的屏幕保护程序事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想监视OSX盒上的屏幕保护程序和锁屏事件.作为第一步,我对他们很满意,只需将其打印到控制台即可.

I want to monitor screensaver and lockscreen events on an OSX box. As a first pass, I'm fine with them just printing to the console.

别人的问题的建议之后,我写了一些Objective C来监听可可通知为了 com.apple.screensaver.didstartcom.apple.screensaver.didstopcom.apple.screenIsLockedcom.apple.screenIsUnlocked事件.

Following the advice of another's question, I wrote some Objective C to listen for Cocoa Notifications for the com.apple.screensaver.didstart, com.apple.screensaver.didstop, com.apple.screenIsLocked, and com.apple.screenIsUnlocked events.

// 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;
}

它可以很好地编译,但是当我运行它时,我似乎没有观察到任何屏幕保护程序事件(尽管多次运行了屏幕保护程序):

It compiles fine, but when I run it, I don't seem to observe any screensaver events (despite having the screensaver come on multiple times):

% gcc -Wall ScreenSaverMonitor.m ScreenSaverMonitorMain.m -o ScreenSaverMonitor -lobjc -framework Cocoa
% ./ScreenSaverMonitor
running loop (^C to quit)...
^C
%

我对Objective C和Cocoa的知识非常生锈,所以我不确定我使用的框架是否错误,或者我是否注册了错误的事件(也不知道在哪里发现这些错误的原因).正确的事件).

My Objective C and Cocoa knowledge is very rusty, so I'm not sure if I'm using the framework wrong, or if I've registered for the wrong events (nor where to look to find out whether those are the right events or not).

那我在做什么错了?

推荐答案

您已经评论了您的问题.

You've commented your problem already.

while(1); // busy wait's bad, I know, but easy to implement

以上几乎总是一个坏主意.

The above is almost ALWAYS a bad idea.

NSDistributedNotificationCenter实际上需要一个正在运行的主线程NSRunLoop进行操作.

NSDistributedNotificationCenter actually requires a running main thread NSRunLoop to operate.

http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Notifications/Articles/NotificationCenters.html#//apple_ref/doc/uid/20000216-BAJGDAFC

在OS X上从命令行应用程序的main()创建和旋转运行循环是一件相当简单的事情.快速搜索提供了很多示例.

Creating and spinning a run loop from the main() of a command line application on OS X is a fairly simple thing to do. There are plenty of examples available with a quick search.

这篇关于监视OSX中的屏幕保护程序事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆