Ola Folks,
我想再次使用SO分享的知识库中喝酒。
我为OSX写了一个小应用程序,它将关键事件发送到应用程序。我的目标是OSX 10.5.x和更新版本。但是,当我为10.6.x构建时,问题仍然存在。一切正常,除非我只发送修改键; Alt,Command,Control和Shift。
问题在于,在两台MacBook上,只要测试人员使用鼠标移动光标或触摸触控板,修改键的事件就会被清除。
在安装了XCode的桌面上,一切正常。就像它应该的那样。在两个不同的MacBook上,出现问题。桌面有一个标准的101键键盘和一个多键鼠标 当鼠标连接到MacBooks时,使用带滚轮的双键鼠标。但是,如果没有连接外围设备并使用触摸板,则会出现问题。
我期望发生的是Modifier Key事件被发送到目标应用程序,用户使用鼠标/触摸板移动光标,按下鼠标/触摸板上的按钮和/或使用修改器按下键盘上的按键关键事件'活跃'。然后,当它们完成时,将发送修改键的键上事件。
以下是我发送按键事件的方法,本例为Shift键:
case ModKeyShiftDown:
xEventSource = CGEventSourceCreate(kCGEventSourceStatePrivate);
xTheCommand = CGEventCreateKeyboardEvent(xEventSource, kVK_Shift, true);
CGEventSetFlags(xTheCommand, kCGEventFlagMaskAlternate);
CGEventPost(kCGHIDEventTap, xTheCommand);
//CGEventPost(kCGSessionEventTap, xTheCommand);
//CGEventPost(kCGAnnotatedSessionEventTap, xTheCommand);
CFRelease(xTheCommand);
CFRelease(xEventSource);
break;
我使用了所有三个标志来创建事件源(kCGEventSourceStatePrivate,kCGEventSourceStateCombinedSessionState和kCGEventSourceStateHIDSystemState)。
我尝试使用Event Source创建键盘事件以及null作为第一个参数。
我已尝试在活动中使用和不使用适当的标志。
我尝试了各种发布活动的组合; kCGHIDEventTap,kCGSessionEventTap和kCGAnnotatedSessionEventTap。
为了完整性,以下是我为Shift键发送up事件的方法:
case ModKeyShiftUp:
xEventSource = CGEventSourceCreate(kCGEventSourceStatePrivate);
xTheCommand = CGEventCreateKeyboardEvent(xEventSource, kVK_Shift, false);
CGEventSetFlags(xTheCommand, 0);
CGEventPost(kCGHIDEventTap, xTheCommand);
//CGEventPost(kCGSessionEventTap, xTheCommand);
//CGEventPost(kCGAnnotatedSessionEventTap, xTheCommand);
CFRelease(xTheCommand);
CFRelease(xEventSource);
break;
当测试人员触发修改键按下事件时,他们可以看到光标按预期更改。这让我知道目标应用程序正在处理事件。但是,只要他们触摸鼠标或触摸板,光标就会变回标准光标并处理鼠标事件,就好像没有修改键事件处于活动状态一样。
我想知道发送事件的方式是否有问题。我还想知道是否有另一种方法来发送即将起作用的Modifier Key事件。
对不起,如果我推翻这个。我的理由是我只睡了几个小时。 :P
感谢名单
-isdi -
答案 0 :(得分:0)
奥拉,
有趣的是,使用AXUIElementRef和AXUIElementPostKeyboardEvent似乎有效。
无论出于何种原因,使用上述辅助功能对象和方法发送关键事件可以解决测试人员的问题。