Я не верю, что вы можете делать то, на что надеетесь.Прежде всего, NSWorkspace
использует свой собственный NSNotificationCenter
, который отличается от значения по умолчанию NSNotificationCenter
, возвращаемого с +defaultCenter
.
Я не верю, что существует строгий CF-эквивалент этих NSWorkspace
звонки.Вероятно, существуют высокоуровневые эквиваленты на основе углерода, но они недоступны в 64-разрядной среде, и их, скорее всего, следует избегать.
Вы должны быть в состоянии выполнить то, что вы хотите, с помощью небольшого помощника Objective-Cкласс для получения уведомлений и пересылки их вашему классу C ++, как показано в следующем коде:
EDIT: обновлено для удаления любого Objective-C из заголовочных файлов.Просто используйте общие void *
указатели, которые вы можете использовать внутри файла .mm.
.h:
//@class MDWorkspaceWatcher;
class MyClass {
private:
// MDWorkspaceWatcher *workspaceWatcher;
void *workspaceWatcher;
public:
MyClass();
~MyClass();
// const void didActivateApp(NSNotification *notification) const;
// const void didDeactivateApp(NSNotification *notification) const;
const void didActivateApp(void *anNSnotification) const;
const void didDeactivateApp(void *anNSnotification) const;
};
.mm:
Часть Objective-C:
@interface MDWorkspaceWatcher : NSObject {
MyClass *myClass;
}
- (id)initWithMyClass:(MyClass *)aMyClass;
@end
@implementation MDWorkspaceWatcher
- (id)initWithMyClass:(MyClass *)aMyClass {
if ((self = [super init])) {
myClass = aMyClass;
[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self
selector:@selector(didActivateApp:)
name:NSWorkspaceDidActivateApplicationNotification
object:nil];
[[[NSWorkspace sharedWorkspace] notificationCenter] addObserver:self
selector:@selector(didDeactivateApp:)
name:NSWorkspaceDidDeactivateApplicationNotification
object:nil];
}
return self;
}
// very important:
- (void)dealloc {
[[[NSWorkspace sharedWorkspace] notificationCenter] removeObserver:self];
[super dealloc];
}
- (void)didActivateApp:(NSNotification *)notification {
myClass->didActivateApp(notification);
}
- (void)didDeactivateApp:(NSNotification *)notification {
myClass->didDeactivateApp(notification);
}
@end
C ++ part:
MyClass::MyClass() {
this->workspaceWatcher = [[MDWorkspaceWatcher alloc] initWithMyClass:this];
}
MyClass::~MyClass() {
[(MDWorkspaceWatcher *)this->workspaceWatcher release];
}
MyClass::didActivateApp(void *anNSnotification) {
NSDictionary *appInfo = [(NSNotification *)anNSnotification userInfo];
NSLog(@"appInfo == %@", appInfo);
}
MyClass::didDeactivateApp(void *anNSnotification) {
NSDictionary *appInfo = [(NSNotification *)anNSnotification userInfo];
NSLog(@"appInfo == %@", appInfo);
}
Обратите внимание, что для NSDictionary
используется бесплатный номер CFDictionaryRef
, поэтому вы можете просто разыграть appInfo
NSDictionary
на CFDictionaryRef
и затем вызовите функции CF
, чтобы получить доступ к содержимому словаря, если вы предпочитаете C, а не Objective-C.
Обратите внимание, что центр уведомлений владеет словарем appInfo
(в другихсловами, он будет автоматически освобожден), поэтому вы не должны вызывать CFRelease()
на него, как если бы вы использовали CFCreate*
/ CFCopy*
связанный код.