Objective c 创建主事件循环(用于热键等)

Objective c 创建主事件循环(用于热键等),objective-c,macos,objective-c++,macos-carbon,Objective C,Macos,Objective C++,Macos Carbon,我正在尝试编写一个独立的应用程序来注册一个全局热键。下面是我的代码,我用代码> GCC-FraseFraseFrase-框架AppKIT-框架碳-LSTDC +NAMSG.MM -O NAMSG < /代码> ./P> 我已经投了一张票 do { event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantFuture] inMode: NSDefaultRunLoopMode

我正在尝试编写一个独立的应用程序来注册一个全局热键。下面是我的代码,我用代码> GCC-FraseFraseFrase-框架AppKIT-框架碳-LSTDC +NAMSG.MM -O NAMSG < /代码> ./P> 我已经投了一张票

    do {
        event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantFuture] inMode: NSDefaultRunLoopMode dequeue:YES];
        if (event != nil) {
            [self handleEvent:event];
        }
    } while(true);
但是,我的(Command+3)热键未被拾取。这种热键组合确实有效,因为我能够使用javascript FFI完成这段代码,但现在我正尝试使用Objective-C++完成这段代码

我也试过了

[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]];
是否有其他方法可以创建主事件循环

#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>
#import <Carbon/Carbon.h>

void showAlert() {
    NSAlert *alert = [[[NSAlert alloc] init] autorelease];
    [alert setMessageText:@"Hi there."];
    [alert runModal];
}

OSStatus MyHotKeyHandler(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData) {
    //Do something once the key is pressed
    showAlert();

    return noErr;
}

void registerHotkey() {
    EventHotKeyRef gMyHotKeyRef;
    EventHotKeyID gMyHotKeyID;
    EventTypeSpec eventType;
    eventType.eventClass=kEventClassKeyboard;
    eventType.eventKind=kEventHotKeyPressed;

    OSStatus installed = InstallApplicationEventHandler(&MyHotKeyHandler,1,&eventType,NULL,NULL);

    gMyHotKeyID.signature='htk1';
    gMyHotKeyID.id=1;

    OSStatus registered = RegisterEventHotKey(20, cmdKey, gMyHotKeyID, GetApplicationEventTarget(), 0, &gMyHotKeyRef);
}

int main(int argc, char * argv[]){

    registerHotkey();


    NSEvent* event;

    do {
        event = [NSApp nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantFuture] inMode: NSDefaultRunLoopMode dequeue:YES];
        if (event != nil) {
            [self handleEvent:event];
        }
    } while(true);

    return 0;
}
#导入
#进口
#进口
void showAlert(){
NSAlert*警报=[[[NSAlert alloc]初始化]自动释放];
[alert setMessageText:@“你好。”];
[警报运行模式];
}
OSStatus MyHotKeyHandler(EventHandlerCallRef nextHandler、EventRef theEvent、void*用户数据){
//按键后做些什么
showarert();
返回noErr;
}
void registerHotkey(){
EventHotKeyRef gMyHotKeyRef;
EventHotKeyID-gMyHotKeyID;
事件类型规范事件类型;
eventType.eventClass=kEventClassKeyboard;
eventType.eventKind=kEventHotKeyPressed;
OSStatus installed=InstallApplicationEventHandler(&MyHotKeyHandler,1,&eventType,NULL,NULL);
gMyHotKeyID.signature='htk1';
gMyHotKeyID.id=1;
OSStatus registered=RegisterEventThotKey(20,cmdKey,gMyHotKeyID,GetApplicationEventTarget(),0,&gMyHotKeyRef);
}
int main(int argc,char*argv[]){
registerHotkey();
N事件*事件;
做{
事件=[NSApp NextEventMachingMask:NSAnyEventMask untilDate:[NSDate distantFuture]inMode:NSDefaultRunLoopMode出列:是];
如果(事件!=nil){
[自助事件:事件];
}
}虽然(正确);
返回0;
}

首先,NSApp不是自动创建的;您可能需要调用
NSApplicationMain()
。尽管可能还有另一种方法,但这是创建
NSApplication
和运行循环的标准方法。其次,
[self-handleEvent:event]
打算做什么?您不在那里的ObjC方法中;是否有一个全球性的
self
呢?你是在使用GNUStep还是苹果的Cocoa?我不确定我在这方面是初学者。我是一个有脚本的人。它没有引起任何错误,只是在编译时发出警告,所以我尝试了它。非常感谢您的回复。我会立即搜索
NSApplicationMain
@Josh Caswell我很确定这是Cocoa,这里有一张我正在制作的照片——如果你与GNUStep合作,我想你会知道的。:)你有Xcode的副本吗?这可能会大大简化你的生活;您可能需要调用
NSApplicationMain()
。尽管可能还有另一种方法,但这是创建
NSApplication
和运行循环的标准方法。其次,
[self-handleEvent:event]
打算做什么?您不在那里的ObjC方法中;是否有一个全球性的
self
呢?你是在使用GNUStep还是苹果的Cocoa?我不确定我在这方面是初学者。我是一个有脚本的人。它没有引起任何错误,只是在编译时发出警告,所以我尝试了它。非常感谢您的回复。我会立即搜索
NSApplicationMain
@Josh Caswell我很确定这是Cocoa,这里有一张我正在制作的照片——如果你与GNUStep合作,我想你会知道的。:)你有Xcode的副本吗?这可能会大大简化你的生活。