12

我正在寻找一种方法来设计一个带有修饰键的小面板(例如 shift、command),并且必须像虚拟键盘一样点击它。

我希望它有这种行为:

  • 点击虚拟键(shift)。
  • 换档按钮保持不变,并一直被按下。
  • 用我的标准键盘输入一些东西。
  • 再次单击虚拟 shift 键以释放它。

这是我正在使用的代码:

CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState);
CGEventRef shiftKeyDown = CGEventCreateKeyboardEvent(source, (CGKeyCode)56, YES);
CGEventRef shiftKeyUp = CGEventCreateKeyboardEvent(source, (CGKeyCode)56, NO);

CGEventPost(kCGAnnotatedSessionEventTap, shiftKeyDown);
CGEventPost(kCGAnnotatedSessionEventTap, shiftKeyUp);

CFRelease(shiftKeyUp);
CFRelease(shiftKeyDown);
CFRelease(source);

在我再次单击它之前,我找不到保持按下状态的方法。我虽然“Push On Push Off”按钮单元类型是关键,但不幸的是没有。:-)

有什么帮助吗?

提前致谢。

4

1 回答 1

4

以这种方式虚拟按下的 shift 键将在随后发生不包含 shift 标志的事件时自动释放。这似乎是一个限制,或者可能是一个错误,考虑到文档类型另有说明:https ://developer.apple.com/reference/coregraphics/cgevent/1456564-init#discussion

我发现实现您正在寻找的唯一方法是设置一个事件侦听器,并将 shift 标志添加到应该由 Shift 键修改的每个事件。

如何收听键盘事件的示例:https ://stackoverflow.com/a/31898592/1445812 (Swift)

有关如何将 shift 标志设置为拦截事件的示例:

event?.flags.insert(.maskShift)

希望这可以帮助。如果有人知道如何做同样的事情而不必为每个事件添加标志,请告诉。

于 2017-03-10T11:54:23.443 回答