如何在登录窗口mac OS中使用CGEventPost模拟键盘和鼠标事件?

lau*_*man 6 keyboard macos mouse chrome-remote-desktop

我创建了一个使用CGEventPost来模拟键盘的登录前代理.仅供参考我正在开发类似于teamviewer的远程控制应用程序.

键盘

CGEventRef keyEvent = CGEventCreateKeyboardEvent( NULL, keyCode, down ) ;
CGEventPost( kCGHIDEventTap, keyEvent ) ;
CFRelease( keyEvent ) ;
Run Code Online (Sandbox Code Playgroud)

老鼠

CGEventRef event = CGEventCreateMouseEvent(eventSource, eventType, mouseLocation, mouseButton );
CGEventPost(kCGHIDEventTap, event);
CFRelease(event);
Run Code Online (Sandbox Code Playgroud)

登录前启动代理

<?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>
Run Code Online (Sandbox Code Playgroud)

CGEventPost不起作用,登录后我在Console日志中得到以下内容

Untrusted apps are not allowed to connect to
Window Server before login.
Run Code Online (Sandbox Code Playgroud)

我搜索了o chromium的遥控器(它有键盘和鼠标模拟工作)源代码.他们使用CGEventPost作为键盘,但它在登录窗口中有效.

https://cs.chromium.org/chromium/src/remoting/host/input_injector_mac.cc?rcl=0&l=42

他们似乎在特权助手工具目录中使用sh文件并用于加载服务,我尝试将我们的服务放在特权助手工具中,但事件处理仍然失败.

不推荐使用的API CGPostMouseEvent,CGPostKeyBoardEvent没有问题,但是我真的很想知道非弃用的键盘API如何在chrome中工作.

lau*_*man 6

你应该添加到二进制文件的部分中没有未记载的(经典的苹果,通过默默无闻的安全性),以便在LoginWindow Context中运行时使CGEventPost神奇地工作.

如果您使用的是gcc,请将以下内容添加到编译标志中

gcc <YOUR SOURCES AND FLAGS> -sectcreate CGPreLoginApp __CGPreLoginApp /dev/null
Run Code Online (Sandbox Code Playgroud)

如果您正在使用XCode,请将以下内容添加到项目的Build设置中的Other Linker标志:

"-sectcreate"
__CGPreLoginApp
__cgpreloginapp
/dev/null
Run Code Online (Sandbox Code Playgroud)

参考LDFLAGS的https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-700/IOHIDFamily.xcodeproj/project.pbxproj项目文件