看一下CGEventSource.h中的注释。将信息放在一起比使用活动服务参考 http://developer.apple.com/library/mac/#documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html。长但更正确的方法看起来像创建事件源 http://developer.apple.com/library/mac/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html#//apple_ref/doc/uid/TP40003550-CH202-BBCHCGGE(这受内存管理规则的约束;您需要CFRelease
如果您在程序终止之前使用完它,则使用它):
myEventSource = CGEventSourceCreate(kCGEventSourceStatePrivate);
这将创建您自己的具有唯一 ID 的私有事件源;然后您表明您创建的事件来自那里:
CGEventRef myKeyboardEvent = CGEventCreateKeyboardEvent(myEventSource,
keyCode, true);
当事件发生时,检查是否来自您自己:
if( (CGEventGetType(newEvent) == kCGEventKeyDown) &&
(CGEventGetIntegerValueField(newEvent, kCGEventSourceStateID) == CGEventSourceGetSourceStateID(myEventSource) ) {
还有一个用户数据字段 http://developer.apple.com/library/mac/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html#//apple_ref/doc/uid/TP40003550-CH202-DontLinkElementID_19如果您需要的话,可以获取允许您传递任意 64 位的源代码。
快速而肮脏的方法是尝试选择一个对于键盘事件来说不太可能是有意义的值的事件字段,例如kCGMouseEventPressure
并将其变成签名:
CGEventSetIntegerValueField(myKeyboardEvent,
kCGMouseEventPressure,
0xFEEDFACE);
// The field is an int_64 so you could make the sig longer