2013-07-21 44 views
10

我正在寻找一种方法来设计一个带有修饰键的小面板(例如shift,command),并且必须有可能像虚拟键盘那样点击它。CGEventPost - 按住一个按键(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); 

我不能找到一种方法来保持按下状态,直到我点击它另一个时间。我虽然“按下按钮”按钮单元格类型是关键,但不幸的是没有。 :-)

有帮助吗?

在此先感谢。

+1

我有一个CGEventPost类似的问题,我试图模拟修饰键按住,但我发现有趣的是,当我移动我的实际鼠标或按下我的实际键盘上的任何键时,这些修改键将被重置,证明通过检查内置键盘查看器。你的情况是一样的吗? – Jerry

+0

你能解决这个问题吗?我看到同样的事情。 –

+0

有同样的问题。 – aristidesfl

回答

0

这种方式被虚拟按下的换档键,在后面跟随一个不包含换档标志的事件时会自动释放。这似乎是一个限制,或者可能是一个错误,考虑到文档排序指示:https://developer.apple.com/reference/coregraphics/cgevent/1456564-init#discussion

我发现实现你要找的东西的唯一方法是设置一个事件监听器,并添加移位标志到每个应该由Shift键修改的事件。如何监听键盘事件

例子:https://stackoverflow.com/a/31898592/1445812(SWIFT)如何有移动标志

例截获事件:

event?.flags.insert(.maskShift) 

希望这有助于。如果有人知道如何做到这一点,而不必为每个事件添加标志,请告诉。

+0

AppleScript:“告诉应用程序”系统事件“将键向下移动”和“告诉应用程序”系统事件“将键向上移动”。 – Willeke

+0

@Willeke意识到这一点,但你如何听取applescript中的关键事件? – aristidesfl

+0

您不必听,换档键停下来。 – Willeke