与kEventHotKeyReleased的行为有关的问题是:
例如,我按Cmd-Shift-P组合键.一旦释放“P”键,触发热键事件.当所有的键都被取消时,我需要触发事件(或者手动触发它)(也就是Cmd和Shift键被释放).
很容易监控热键,但是我没有看到任何监视单个按键.如果我可以监控修饰符键状态,我会在业务.
任何提示如何做到这一点?
提前致谢!
更新:
我已经尝试使用kEventRawKeyUp和kEventRawKeyModifiersChanged,但是kEventHotKeyReleased工作这两个,即使我设置它们的方式与kEventHotKeyReleased完全相同.
EventTypeSpec eventTypes[] = {{kEventClassKeyboard,kEventHotKeyReleased},{kEventClassKeyboard,kEventRawKeyUp}}; // Changing the order in the list does not help,nor does removing kEventHotKeyReleased OSStatus err = InstallApplicationEventHandler(&globalHotkeyHandler,GetEventTypeCount(eventTypes),eventTypes,NULL,NULL); // err == noErr after this line
为了kEventHotKeyReleased而调用globalHotKeyHandler方法,但是由于某些原因我似乎无法掌握,因此不适用于kEventRawKeyUp.以下是我的globalHotKeyHandler方法:
OSStatus globalHotkeyHandler(EventHandlerCallRef nextHandler,EventRef anEvent,void *userData) { NSLog(@"Something happened!"); }
有没有额外的电话需要做或别的我忘了?
N.B:乍看起来,似乎可能是辅助设备的Access被禁用,但不是.所以我很无知
更新2:
我调查了一下CGEventTap Leibowitzn的建议,我想出了这个设置:
CFMachPortRef keyUpEventTap = CGEventTapCreate(kCGHIDEventTap,kCGHeadInsertEventTap,kCGEventTapOptionListenOnly,kCGEventKeyUp,&keyUpCallback,NULL); CFRunLoopSourceRef keyUpRunLoopSourceRef = CFMachPortCreateRunLoopSource(NULL,keyUpEventTap,0); CFRelease(keyUpEventTap); CFRunLoopAddSource(CFRunLoopGetCurrent(),keyUpRunLoopSourceRef,kcfRunLoopDefaultMode); CFRelease(keyUpRunLoopSourceRef);
…和回调:
CGEventRef keyUpCallback (CGEventTapProxy proxy,CGEventType type,CGEventRef event,void *refcon) { NSLog(@"KeyUp event tapped!"); return event; }
正如你可以看到,我使用kCGEventKeyUp作为事件点击的掩码,但不知何故,我正在接收鼠标向下的事件!
更新3:
好的忘了,我忽略了文档中使用CGEventMaskBit(kCGEventKeyUp)这个参数的行,所以正确的调用是:
CGEventTapCreate(kCGHIDEventTap,CGEventMaskBit(kCGEventKeyUp),NULL);
我仍然有一个问题:修饰符键不触发kCGEventKeyUp …
更新4:
好的忘了再一次…我一定会回答自己的问题5分钟后问他们今天啊!
要截取修饰键,请使用kCGEventFlagsChanged:
CGEventTapCreate(kCGHIDEventTap,CGEventMaskBit(kCGEventFlagsChanged),&callbackFunction,NULL);
所以本质上我得到了关键和修正键状态检测工作,但我仍然有兴趣知道为什么kEventRawKeyUp不工作…
N.B:另请注意,我正在Tiger开发,目的是尽可能多地支持新旧版本的操作系统. CGEventTap是10.4,所以现在我将使用它,但是可以接受向后兼容的解决方案.
解决方法
http://developer.apple.com/mac/library/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html#//apple_ref/c/func/CGEventTapCreate
不幸的是,如果应用程序要求安全输入,事件点击将停止工作.例如Quicken.