奥拉民间,

我想再一次从用SO人分享知识的池喝。

我已经写的OSX一个小应用程序发送键事件到应用程序。我针对OSX 10.5和更新。然而,当我建立10.6.x的,以及存在的问题。一切正常,除非我只发送修改键罚款; Alt键,命令,控制和转换。

的问题是,在两个的MacBook,对于修改键的事件显示为测试者使用鼠标或触摸触摸板将光标移动到被清除尽快。

在安装了XCode桌面,一切工作正常。就像它应该。在两个不同的MacBook,出现问题。桌面有一个标准的101键键盘,并附多键鼠标。点击 当鼠标被连接到的MacBook,使用两个键鼠标和滚轮。然而,当没有外围设备连接,并用于触摸板存在的问题。

我希望发生的是,修改键事件被发送到目标应用程序,用户与改性剂移动使用鼠标/触摸板上的鼠标/触摸板和/或按光标键,按下按钮键盘上键按下事件“活跃”。然后,当他们完成,键抬起事件的修饰键被发送。

下面是我要打发按键事件,在这个例子中的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)。

我试图创建具有事件源的事件键盘以及null作为第一个参数。

我曾尝试使用和不使用该事件相应的标志。

我试图发布事件的各种组合; kCGHIDEventTap,kCGSessionEventTap和kCGAnnotatedSessionEventTap。

有关完整,这里是我发送了事件的Shift键:

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;

当测试者触发修改键按下事件,它们可以看到光标改变为预期。这让我知道正在由目标应用程序处理该事件。然而,只要他们触摸鼠标或触摸板,光标变回标准光标和鼠标事件被处理,就好像没有修改键事件是活动的。

我想知道是否有与我送的事件的方式有问题。我也想知道是否有送是去上班键修改事件的另一种方法。

对不起,如果我overtalked此。我的借口是,我只睡了几个小时。 :P

感谢名单

-isdi -

有帮助吗?

解决方案

奥拉,

有趣的是,使用AXUIElementRef和AXUIElementPostKeyboardEvent似乎工作。

无论出于何种原因,发送使用该辅助功能对象和方法上述解决问题的测试人员的按键事件。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top