2

我正在尝试使用 Quartz Event Services 以编程方式触发键盘快捷键:

CGEventSourceRef src = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);

CGEventRef leftDown = CGEventCreateKeyboardEvent(src, 0x7b, true); // creating left arrow down event
CGEventRef leftUp = CGEventCreateKeyboardEvent(src, 0x7b, false); // creating left arrow up event

CGEventSetFlags(leftDown, kCGEventFlagMaskCommand); // setting command key modifier flag
CGEventSetFlags(leftUp, kCGEventFlagMaskCommand); // ""

CGEventTapLocation loc = kCGHIDEventTap;
CGEventPost(loc, leftDown);
CGEventPost(loc, leftUp);

CFRelease(leftDown);
CFRelease(leftUp);
CFRelease(src);

如果您使用的不是箭头键,则此代码可用于触发系统功能。但如果您确实使用箭头键,代码只会让您的光标移动。

例如,使用此代码触发 command-space(0x31, kCGEventFlagMaskCommand)会成功调出 Spotlight,但如果您将 Spotlight 映射到 command-left_arrow,然后使用此代码触发 command-left_arrow,它只会使光标跳转到行首。


值得注意的是,当我尝试触发包含箭头键的系统快捷方式时,Apple Script 的行为方式完全相同。

有解决方法吗?

谢谢你的帮助,我很感激。

4

1 回答 1

2

CGEventSourceStateID由于某些原因,箭头键只能以您期望的方式与“私人”一起使用。换行

CGEventSourceRef src = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);

CGEventSourceRef src = CGEventSourceCreate(kCGEventSourceStatePrivate);

它会按预期工作。(在 macOS 10.13.4 上测试)

于 2018-07-29T14:18:30.780 回答