(Mac)模拟键盘快捷键-箭头键不起作用

时间:2018-07-29 01:38:09

标签: objective-c macos keyboard-shortcuts cgeventtap

我正在尝试使用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);

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

例如,使用此代码(0x31, kCGEventFlagMaskCommand)触发命令空间会成功调亮聚光灯,但是如果将聚光灯映射到command-left_arrow,然后使用此代码触发command-left_arrow,它只会使光标跳到该行的开头。


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

是否有解决方法?

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

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

CGEventSourceRef src = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);

CGEventSourceRef src = CGEventSourceCreate(kCGEventSourceStatePrivate);

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