我正在使用DDHotKey跟踪一些系统范围的键盘快捷键。当事件被触发时,只有我的应用程序收到它。是否可以在不阻止事件传递到其原始目标应用程序的情况下观察它?
以下是该模块注册事件处理程序的方式:
InstallApplicationEventHandler(&dd_hotKeyHandler, 1, &eventSpec, NULL, NULL);
以及事件处理程序本身:
OSStatus dd_hotKeyHandler(EventHandlerCallRef nextHandler, EventRef theEvent, void *userData) {
@autoreleasepool {
EventHotKeyID hotKeyID;
GetEventParameter(theEvent, kEventParamDirectObject, typeEventHotKeyID, NULL, sizeof(hotKeyID),NULL,&hotKeyID);
UInt32 keyID = hotKeyID.id;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"hotKeyID = %u", keyID];
NSSet *matchingHotKeys = [[DDHotKeyCenter sharedHotKeyCenter] hotKeysMatchingPredicate:predicate];
if ([matchingHotKeys count] > 1) { NSLog(@"ERROR!"); }
DDHotKey *matchingHotKey = [matchingHotKeys anyObject];
NSEvent *event = [NSEvent eventWithEventRef:theEvent];
NSEvent *keyEvent = [NSEvent keyEventWithType:NSKeyUp
location:[event locationInWindow]
modifierFlags:[event modifierFlags]
timestamp:[event timestamp]
windowNumber:-1
context:nil
characters:@""
charactersIgnoringModifiers:@""
isARepeat:NO
keyCode:[matchingHotKey keyCode]];
[matchingHotKey invokeWithEvent:keyEvent];
}
return noErr;
}
最佳答案
不,热键功能的全部要点是事件被注册该 key 的应用程序吞没。
你想要一个global event monitor ,它允许您观察系统中其他任何地方的关键事件,但不影响它们。
[NSEvent addGlobalMonitorForEventsMatchingMask:NSKeyUpMask
handler:^(NSEvent * event){
// See if the key is the one you want and act on it.
}];
关于objective-c - DDHotKey - 跟踪而不取消事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15143571/