2017-01-02 14 views
5

मैंने एक प्री-लॉगिन एजेंट बनाया है जो कीबोर्ड को सिमुलेट करने के लिए CGEventPost का उपयोग करता है। एफवाईआई मैं टीमव्यूअर के समान रिमोट कंट्रोल ऐप विकसित कर रहा हूं।लॉगिन विंडो मैक ओएस में CGEventPost का उपयोग करके कीबोर्ड और माउस ईवेंट अनुकरण कैसे करें?

कीबोर्ड

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 काम नहीं कर रहा है, मैं प्रवेश के बाद कंसोल लॉग में निम्न प्राप्त

मैंने क्रोमियम के रिमोट कंट्रोल (जिसमें कीबोर्ड और माउस सिमुलेशन काम कर रहा है) स्रोत कोड खोजा है। वे कीबोर्ड के लिए CGEventPost का उपयोग करते हैं, लेकिन यह लॉगिन विंडो में काम करता है।

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

वे विशेषाधिकार प्राप्त सहायक उपकरण निर्देशिका में श फ़ाइल का उपयोग और सेवा को लोड करने के लिए उपयोग करने के लिए लगता है, मैं विशेषाधिकार प्राप्त सहायकों उपकरण में हमारी सेवा डाल करने की कोशिश की, लेकिन अभी भी घटना से निपटने में विफल रहता है।

अस्वीकृत एपीआई CGPostMouseEvent, CGPostKeyBoardEvent बिना किसी समस्या के काम करते हैं, लेकिन वास्तव में यह जानना चाहेंगे कि गैर-बहिष्कृत कीबोर्ड एपीआई क्रोमियम में कैसे काम करता है।

उत्तर

5

लॉग इनविंडो संदर्भ में चलते समय CGEventPost जादुई रूप से काम करने के लिए, बाइनरी के अनुभागों में आपको अवशोषित (क्लासिक सेब, अस्पष्टता के माध्यम से सुरक्षा) सामान शामिल करना चाहिए।

आप जीसीसी का उपयोग कर रहे हैं, तो आप XCode उपयोग कर रहे हैं संकलन झंडे

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

के लिए निम्न जोड़ने के लिए, इस परियोजना के बिल्ड सेटिंग्स में अन्य लिंकर झंडे को निम्नलिखित जोड़ें:

"-sectcreate" 
__CGPreLoginApp 
__cgpreloginapp 
/dev/null 

https://opensource.apple.com/source/IOHIDFamily/IOHIDFamily-700/IOHIDFamily.xcodeproj/project.pbxproj एलडीएफएलजीएस

+0

के लिए प्रोजेक्ट फ़ाइल का संदर्भ लें बस यह कहना चाहते हैं कि ऑर्डर महत्वपूर्ण है –

+1

आप महोदय, मेरे उद्धारकर्ता हैं! – Nidhoegger

संबंधित मुद्दे