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

8
我创建了一个预登录代理,使用CGEventPost模拟键盘。顺便说一下,我正在开发类似于TeamViewer的远程控制应用程序。
键盘
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是如何工作的。
1个回答

13

有一些未记录的(经典的苹果公司“安全通过混淆”)内容,您应该将其添加到二进制文件的部分中,以便在运行于LoginWindow上下文时使CGEventPost魔法般地工作。

如果您正在使用gcc,则将以下内容添加到编译标志中。

gcc <YOUR SOURCES AND FLAGS> -sectcreate CGPreLoginApp __CGPreLoginApp /dev/null
如果您正在使用XCode,请将以下内容添加到项目的构建设置中的“其他链接器标志”:
"-sectcreate"
__CGPreLoginApp
__cgpreloginapp
/dev/null

请参考https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-700/IOHIDFamily.xcodeproj/project.pbxproj项目文件以获取LDFLAGS。


1
只想说顺序很重要。 - Cherpak Evgeny
1
您,先生,是我的救星! - Nidhoegger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接