2017-01-02 17 views
5

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.

Odpowiedz

5

Istnieje nieudokumentowane (klasyczne jabłko, bezpieczeństwo przez niejasne) rzeczy, które powinieneś dodać do sekcji binarnych, aby CGEventPost działał magicznie podczas działania w kontekście LoginWindow.

Jeśli używasz gcc, dodać następujące kompilacji flagi

gcc <YOUR SOURCES AND FLAGS> -sectcreate CGPreLoginApp __CGPreLoginApp /dev/null 

Jeśli używasz Xcode dodać następujące inne flagi Linker w ustawieniach kompilacji projektu:

"-sectcreate" 
__CGPreLoginApp 
__cgpreloginapp 
/dev/null 

Odwołać https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-700/IOHIDFamily.xcodeproj/project.pbxproj plik projektu dla LDFLAGS

+0

Chcę tylko powiedzieć, że kolejność jest ważna –

+1

Ty jesteś, mój zbawca! – Nidhoegger

Powiązane problemy