1

当按下电源按钮时,我会看到以下对话框,如果发送了此通知:

__CFNotification 0x10011f410 {name = com.apple.logoutInitiated; object = 501}

在此处输入图像描述

问题:如何从 C++ 应用程序中侦听此事件并对其采取行动?

供参考:

我设法拼凑了一个 Objective C 代码片段,它可以做到这一点:

#import "AppDelegate.h"

@implementation AppDelegate

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // Insert code here to initialize your application

    @autoreleasepool
    {
        [[NSDistributedNotificationCenter defaultCenter]
         addObserverForName: nil
         object: nil
         queue: [NSOperationQueue mainQueue]
         usingBlock: ^(NSNotification *notification) {

             //The event notification we are looking for:
             //__CFNotification 0x10011f410 {name = com.apple.logoutInitiated; object = 501}

             NSString *event = notification.name;
             BOOL res = [event isEqualToString:@"com.apple.logoutInitiated"];
             if (res)
             {
                 printf("POWER BUTTON PRESSED");
             }
             else
             {
                 printf("IGNORE");
             }
         }];

        [[NSRunLoop mainRunLoop] run];
    }

}
4

3 回答 3

2

一个简单的 c++ SCCE 看起来像:

#include <iostream>
#include <CoreFoundation/CoreFoundation.h>

void
myCallBack(CFNotificationCenterRef center,
           void *observer,
           CFStringRef name,
           const void *object,
           CFDictionaryRef userInfo) {
    std::cout << "Power Button Pressed" << std::endl;
}

int
main(int argc, const char * argv[])
{
    CFNotificationCenterRef distCenter;
    CFStringRef evtName = CFSTR("com.apple.logoutInitiated");
    distCenter = CFNotificationCenterGetDistributedCenter();
    if (NULL == distCenter)
        return 1;
    CFNotificationCenterAddObserver(distCenter, NULL, &myCallBack, evtName, NULL, CFNotificationSuspensionBehaviorDeliverImmediately);
    CFRunLoopRun();
    return 0;
}

并将使用clang++ -framework CoreFoundation testfile.cpp.

你如何将它连接到你自己的应用程序中完全是另一回事。

于 2013-10-30T17:37:37.770 回答
0

本质上,您希望访问NSDistributedNotificationCenter环绕的底层功能。

也许你应该看看CFNotificationCenterRef更具体地说CFNotificationCenterGetDistributedCenter()

这些本身不是 C++,它们是 C 函数,但您可以从 C++ 调用它们。

于 2013-10-30T17:21:08.610 回答
0

CoreFoundation有一个用 C 编写的很好的 API,因此您可以使用该CFNotificationCenterAddObserver函数并将您的 C++ 程序链接到必要的框架。例子:

clang++ <your options> -framework CoreFoundation

官方文档。在这里快速搜索显示了如何使用它的示例

于 2013-10-30T17:22:19.633 回答