Utworzyłem agenta do wstępnego logowania, który używa CGEventPost do symulacji klawiatury. FYI Rozwijam aplikację do zdalnego sterowania podobną do aplikacji Teamviewer.Jak symulować zdarzenia klawiatury i myszy za pomocą CGEventPost w oknie logowania systemu Mac OS?
Klawiatura
CGEventRef keyEvent = CGEventCreateKeyboardEvent(NULL, keyCode, down) ;
CGEventPost(kCGHIDEventTap, keyEvent) ;
CFRelease(keyEvent) ;
Mouse
CGEventRef event = CGEventCreateMouseEvent(eventSource, eventType, mouseLocation, mouseButton);
CGEventPost(kCGHIDEventTap, event);
CFRelease(event);
Pre-login czynnik launch
<?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 nie działa, pojawia się następujący w dziennikach konsoli po zalogowaniu
Untrusted apps are not allowed to connect to
Window Server before login.
Szukałem pilota zdalnego sterowania o chromium (który ma działającą symulację klawiatury i myszy). Używają CGEventPost dla klawiatury, ale działa w oknie logowania.
https://cs.chromium.org/chromium/src/remoting/host/input_injector_mac.cc?rcl=0&l=42
Wydają się użyć pliku sh w uprzywilejowanej pomocnika katalogu narzędzi i użyć do załadowania usługi, starałem oddanie nasze usługi w uprzywilejowanym narzędziem pomocników, ale nadal obsługa zdarzeń kończy się niepowodzeniem.
Przestarzałe API CGPostMouseEvent, CGPostKeyBoardEvent działa bezproblemowo, ale naprawdę chciałbym wiedzieć, w jaki sposób nieaktualny API klawiatury działa w chromie.
Chcę tylko powiedzieć, że kolejność jest ważna –
Ty jesteś, mój zbawca! – Nidhoegger