我创建了一个预登录代理,使用CGEventPost模拟键盘。顺便说一下,我正在开发类似于TeamViewer的远程控制应用程序。
键盘
老鼠
已弃用的API CGPostMouseEvent、CGPostKeyBoardEvent没有问题,但我真的想知道在Chromium中非废弃的键盘API是如何工作的。
键盘
CGEventRef keyEvent = CGEventCreateKeyboardEvent( NULL, keyCode, down ) ;
CGEventPost( kCGHIDEventTap, keyEvent ) ;
CFRelease( keyEvent ) ;
老鼠
CGEventRef event = CGEventCreateMouseEvent(eventSource, eventType, mouseLocation, mouseButton );
CGEventPost(kCGHIDEventTap, event);
CFRelease(event);
预登录启动代理
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>my app label</string>
<key>LimitLoadToSessionType</key>
<string>LoginWindow</string>
<key>RunAtLoad</key>
<true/>
<key>WorkingDirectory</key>
<string>My app directory</string>
<key>ProgramArguments</key>
<array>
<string>app absolute path</string>
<string>service</string>
<string>myservice</string>
</array>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
CGEventPost不起作用,登录后在控制台日志中会看到以下内容
Untrusted apps are not allowed to connect to
Window Server before login.
我已经搜索了 Chromium 的远程控制源代码(其中包含键盘和鼠标模拟功能)。他们使用 CGEventPost 进行键盘操作,但它只能在登录窗口中使用。
https://cs.chromium.org/chromium/src/remoting/host/input_injector_mac.cc?rcl=0&l=42
他们似乎在特权助手工具目录中使用sh文件,并用它来加载服务。我尝试将我们的服务放在特权助手工具中,但事件处理仍然失败。已弃用的API CGPostMouseEvent、CGPostKeyBoardEvent没有问题,但我真的想知道在Chromium中非废弃的键盘API是如何工作的。