我正在使用C ++远程控制应用程序,该应用程序会在另一台计算机上的用户键入内容时将按键注入事件发布到macs。以前,该应用程序使用不推荐使用的代码进行密钥注入:
CGError error = CGPostKeyboardEvent(0, nativeKeyCode, isPressed);
但这与诸如Caps Lock之类的修饰键存在问题,我们希望更新代码,以便不再调用不推荐使用的功能。
经过研究,我使用了不推荐使用的CGEventCreateKeyboardEvent
函数使Caps Lock修改键起作用:
CGEventRef event = CGEventCreateKeyboardEvent(NULL, (CGKeyCode)nativeKeyCode, isPressed);
CGEventPost(kCGHIDEventTap, event);
CFRelease(event);
但是,当远程控制应用程序上的用户退出mac并导航到mac登录屏幕时,在该屏幕上输入密码时此功能不起作用。我能够在每个语句周围打印出日志,并且已将所有内容放入try-catch中,但是没有发生异常或其他明显的错误。我已经在macOS High Sierra上重现了此问题,但在macOS Sierra上也已重现了此问题。
根据我对Apple's documentation的了解,除了检查所创建的事件是否为空之外,没有其他方法可以对这些特定功能进行错误检查。在测试此方案时,event
已成功创建,并且不为空。
我一直在寻找与此相关的任何信息,但在Mac登录屏幕上没有找到任何遇到此特定问题的人。应该注意的是,不赞成使用的代码在登录屏幕上工作正常,而当前代码在锁定屏幕上以及mac上的其他任何地方都可以正常工作。只有在用户完全注销时,登录屏幕上才会失败。
有没有其他人看到过这个问题,并且知道任何解决方案?还是密钥注入代码明显还有其他问题?
答案 0 :(得分:0)
从同事那里找到了解决方案,它与特定于登录屏幕的链接器标志以及Mac上的按键注入功能有关:How to simulate keyboard and mouse events using CGEventPost in login window mac OS?