【问题标题】:The 10.6.3 os x update broke simulated key-presses for Nestopia10.6.3 os x 更新破坏了 Nestopia 的模拟按键
【发布时间】:2011-05-07 18:53:16
【问题描述】:

我发布的 iPhone 应用是一款无线游戏控制器,它将设备上的触摸转换为联网 Mac 上的按键。这允许使用 iPhone 作为控制器来玩模拟器(例如 Nestopia)游戏。当然,我发布它的那天恰逢 os x 更新。安装此更新后,模拟按键在 Nestopia 中不再起作用!更疯狂的是,当我在 Nestopia 中转到“文件 > 打开”时,我可以通过点击 iPhone 控制器上的向上箭头来循环浏览文件列表;即模拟按键在菜单项中起作用,但在游戏本身中不起作用。我用来模拟键的代码如下。鉴于here 的更改列表,任何人都可以确定哪个更改会导致此问题吗?

谢谢!!

#define UP  false
#define DOWN true

-(void)sendKey:(CGKeyCode)keycode andKeyDirection:(BOOL)keydirection{
  CGEventRef eventRef = CGEventCreateKeyboardEvent(NULL, keycode, keydirection);
  CGEventPost(kCGSessionEventTap, eventRef);
  CFRelease(eventRef);
}

【问题讨论】:

  • Lou,请务必在 bugreporter.apple.com 上向 Apple 提交错误报告。点更新真的不应该破坏东西。如果您可以将问题隔离到可重现的测试应用程序上,将会增加直接查看的机会(此外,构建这样的应用程序可能会告诉您需要做什么才能让事情为您工作)。
  • 是使用 Nestopia 还是使用带有 Nestopia 插件的 OpenEmu 有区别吗?
  • @codewarrior:按键在 OpenEmu 中确实有效,但我构建的控制器在使用 OpenEmu 时似乎反应较慢。我确信这是因为 Nestopia 是我在开发过程中选择的模拟器。我确实找到了一种解决方法,我将在下面发布,这样我就可以继续使用 Nestopia 进行演示。唷。
  • @Ken:我按照您的建议构建了一个示例项目并提交了错误报告。

标签: objective-c cocoa macos


【解决方案1】:

Mac Nestopia 的作者正在使用较旧的调用 GetKeys() 来捕获关键事件。从 10.6.3 开始,GetKeys 不会使用本文中详述的方法捕获生成的按键。我发现的解决方法是改用这个:

-(void)sendKey:(CGKeyCode)keycode andKeyDirection:(BOOL)keydirection{
  AXUIElementRef axSystemWideElement = AXUIElementCreateSystemWide();
  AXError err = AXUIElementPostKeyboardEvent(axSystemWideElement, 0, keycode, keydirection);
  if (err != kAXErrorSuccess)
    NSLog(@" Did not post key press!");
}

非常感谢 Richard Bannister 快速回复电子邮件!

【讨论】:

    【解决方案2】:

    我认为这是您的代码的问题,而 不是 10.6.3。我正在编写一个模拟按键的应用,并且我已经升级到 10.6.3,我的模拟按键仍然可以正常工作。

    这就是我正在做的事情:

    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateCombinedSessionState);
    CGEventRef keyDownPress = CGEventCreateKeyboardEvent(source, (CGKeyCode)keyCode, YES);
    CGEventSetFlags(keyDownPress, (CGEventFlags)flags);
    CGEventRef keyUpPress = CGEventCreateKeyboardEvent(source, (CGKeyCode)keyCode, NO);
    
    CGEventPost(kCGAnnotatedSessionEventTap, keyDownPress);
    CGEventPost(kCGAnnotatedSessionEventTap, keyUpPress);
    
    CFRelease(keyDownPress);
    CFRelease(keyUpPress);
    CFRelease(source);
    

    【讨论】:

    • 谢谢,可惜,没有运气。重申一下,我发布的代码(以及你的代码!)确实模拟了 10.6.3 中的按键;我仍然可以玩 Flash 游戏,控制网页等。问题是特定于模拟按键到达 Nestopia。在 10.5 和 10.6 的所有其他版本中,模拟按键按预期控制 Nestopia。但在 10.6.3 中,就好像它们从未发生过一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 2016-07-15
    • 2023-03-21
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 2011-01-23
    相关资源
    最近更新 更多