我发布的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);
}
答案 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);