3

我正在尝试将输入键发送到这样的后台应用程序:

CGEventRef a = CGEventCreateKeyboardEvent(eventSource, 36, true);
CGEventRef b = CGEventCreateKeyboardEvent(eventSource, 36, false);
CGEventPostToPSN(&psn, a);
CGEventPostToPSN(&psn, b);

它不起作用,我认为这是因为该应用程序必须是最前面的应用程序才能接收击键?我对吗?如果是这样,无论如何我可以在不先激活应用程序的情况下发送此事件吗?如果没有,那我做错了什么?谢谢。

4

1 回答 1

3

后台的应用程序不会对关键事件采取行动。您有两个选项可以让您的应用在后台处理它们:Event Taps+[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);

回调很简单。有关信息,请参阅事件服务参考中的回调

于 2011-05-21T20:39:58.560 回答