Приложения в фоновом режиме не влияют на ключевые события. У вас есть два варианта заставить приложение работать с ними, когда оно находится в фоновом режиме: Сигналы событий и +[NSEvent addLocalMonitorForEventsMatchingMask:]
. Опция NSEvent
довольно проста:
// A block callback to handle the events
NSEvent * (^monitorHandler)(NSEvent *);
monitorHandler = ^NSEvent * (NSEvent * theEvent){
NSLog(@"Got a keyDown: %d", [theEvent keyCode]);
// The block can return the same event, a different
// event, or nil, depending on how you want it to be
// handled later. In this case, being in the background,
// there won't be any handling regardless.
return theEvent;
};
// Creates an object that we don't own but must keep track of to
// remove later (see docs). Here, it is placed in an ivar.
monitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSKeyDownMask
handler:monitorHandler];
но вы уже играете с событиями, так что вы можете просто пойти по этому пути.
// Creates an object that must be CFRelease'd when we're done
CFMachPortRef tap = CGEventTapCreateForPSN(myOwnPSN,
kCGTailAppendEventTap,
kCGEventTapOptionDefault,
kCGEventKeyDown,
myEventTapCallback,
NULL);
Обратный вызов прост. Подробнее см. Обратные вызовы в справочнике по службам событий.