10.6.3 os x更新破坏了Nestopia的模拟按键

时间:2010-04-01 17:43:46

标签: objective-c cocoa macos

我发布的iPhone应用程序是一款无线游戏控制器,它将设备上的触摸转换为联网Mac上的按键。这允许使用iPhone作为控制器来玩模拟器(例如Nestopia)游戏。当然,我发布它的那天恰逢os x更新。安装此更新后,模拟按键不再适用于Nestopia!更疯狂的是,当我去'File>在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);
}

2 个答案:

答案 0 :(得分:2)

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的快速电子邮件回复!

答案 1 :(得分:1)

我认为你的代码存在问题而不是 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);