Objective c 创建主事件循环(用于热键等)
我正在尝试编写一个独立的应用程序来注册一个全局热键。下面是我的代码,我用代码> GCC-FraseFraseFrase-框架AppKIT-框架碳-LSTDC +NAMSG.MM -O NAMSG < /代码> ./P> 我已经投了一张票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
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的副本吗?这可能会大大简化你的生活。