9

我已经安装了一个键盘挂钩:

CGEventRef myCGEventCallback(CGEventTapProxy proxy, CGEventType type, CGEventRef event, void *refcon) {

基本上我想获取用户的键盘点击,吃掉输入,然后发布我自己的输入。

因此,如果他点击“g”,我可能想将“foo”发布到文本字段。

我正在用这里找到的文本字段写信CGEventPost: http CGEventSetUnicodeString: //www.mail-archive.com/cocoa-dev@lists.apple.com/msg23343.html

问题是我以编程方式输入的每个字符都在敲击键盘钩子。所以我不能return NULL在键盘钩子中阻止用户输入......这也阻止了所有程序的输入!

我在 C# 的 Windows 端使用“注入”标志对它们进行了区分,请参阅一年前的问题:如何使用低级 8 位标志作为条件?

在 Objective-C 中寻找类似的东西。

4

1 回答 1

6

看看 CGEventSource.h 中的注释。将信息放在一起比使用事件服务参考要容易一些。冗长但更正确的方法看起来像创建一个事件源(它受内存管理规则的约束;CFRelease如果您在程序终止之前完成使用它,则需要它):

myEventSource = CGEventSourceCreate(kCGEventSourceStatePrivate);

这将创建您自己的具有唯一 ID 的私有事件源;然后,您表明您创建的事件来自那里:

CGEventRef myKeyboardEvent = CGEventCreateKeyboardEvent(myEventSource, 
                                                        keyCode, true);

当一个事件进来时,检查它是否来自你自己:

 if( (CGEventGetType(newEvent) == kCGEventKeyDown) &&
     (CGEventGetIntegerValueField(newEvent, kCGEventSourceStateID) == CGEventSourceGetSourceStateID(myEventSource) ) {

如果需要,还有一个用于源的用户数据字段,可让您传递任意 64 位。

快速而肮脏的方法是尝试选择一个不太可能对键盘事件有意义的事件字段,例如kCGMouseEventPressure并将其转换为签名:

CGEventSetIntegerValueField(myKeyboardEvent, 
                            kCGMouseEventPressure, 
                            0xFEEDFACE);
// The field is an int_64 so you could make the sig longer
于 2011-04-30T18:48:54.903 回答