2013-04-23 19 views
8

मैं आईफोन में टच इवेंट इंजेक्ट करना चाहता हूं। मुझे नेटवर्क सॉकेट के माध्यम से टच इवेंट के निर्देशांक मिलते हैं। GSSendEvent अच्छा विकल्प प्रतीत होता है। हालांकि, इसे इनपुट में से एक के रूप में GSEventRecord की आवश्यकता है।GSSendEvent - इंजेक्ट टच इवेंट आईओएस

क्या कोई जानता है कि GSEventRecord कैसे तैयार किया जाए? मैंने इसे कुछ उदाहरणों के आधार पर तैयार किया लेकिन ऐप GSSendEvent कॉल के बाद क्रैश हो गया।

किसी भी मदद की सराहना करें।

-(void) handleMouseEventAtPoint:(CGPoint) point 
{ 
static mach_port_t port_; 

// structure of touch GSEvent 
struct GSTouchEvent { 
    GSEventRecord record; 
    GSHandInfo handInfo; 
} ; 

struct GSTouchEvent *touchEvent = (struct GSTouchEvent *) malloc(sizeof(struct GSTouchEvent)); 

bzero(touchEvent, sizeof(touchEvent)); 

// set up GSEvent 
touchEvent->record.type = kGSEventHand; 
touchEvent->record.windowLocation = point; 
touchEvent->record.timestamp = GSCurrentEventTimestamp(); 
touchEvent->record.infoSize = sizeof(GSHandInfo) + sizeof(GSPathInfo); 
touchEvent->handInfo.type = getHandInfoType(0, 1); 
touchEvent->handInfo.pathInfosCount = 1; 
bzero(&touchEvent->handInfo.pathInfos[0], sizeof(GSPathInfo)); 
touchEvent->handInfo.pathInfos[0].pathIndex  = 1; 
touchEvent->handInfo.pathInfos[0].pathIdentity = 2; 
touchEvent->handInfo.pathInfos[0].pathProximity = 1 ? 0x03 : 0x00; 
touchEvent->handInfo.pathInfos[0].pathLocation = point; 

port_ = GSGetPurpleSystemEventPort(); 

GSSendEvent((GSEventRecord*)touchEvent ,port_); 


} 
static GSHandInfoType getHandInfoType(int touch_before, int touch_now){ 
if (!touch_before) { 
    return (GSHandInfoType) kGSHandInfoType2TouchDown; 
} 
if (touch_now) { 
    return (GSHandInfoType) kGSHandInfoType2TouchChange; 
} 
return (GSHandInfoType) kGSHandInfoType2TouchFinal; 
} 

उत्तर

6

केवल iOS 6

तुम वास्तव में सही रास्ते पर हैं पर परीक्षण किया। समस्या यह है कि आपको यह पता लगाना होगा कि इन चरों को आपको किन मूल्यों को असाइन करना चाहिए।

सबसे पहले, आपको GraphicsServices.h आयात करने की आवश्यकता है। फिर, आप पोर्ट के साथ निम्न कोड आज़मा सकते हैं जिसे आप How to find the purple port for the front most application in IOS 5 and above? से प्राप्त कर सकते हैं।

मैं आईओएस विशेषज्ञ नहीं हूं और ऐप्पल कोई दस्तावेज प्रदान नहीं करता है, इसलिए मैं यहां क्या हो रहा है, इसकी व्याख्या नहीं कर सकता। (यह मेरे लिए ठीक काम करने के लिए होता है।)

वैसे भी, आप हुड के नीचे क्या होता है यह देखने के लिए xcode डीबग मोड का उपयोग करके इसके साथ खेल सकते हैं।

struct GSTouchEvent * touchEvent = (struct GSTouchEvent*) &gsTouchEvent; 
bzero(touchEvent, sizeof(touchEvent)); 
touchEvent->record.type = kGSEventHand; 
touchEvent->record.subtype = kGSEventSubTypeUnknown; 
touchEvent->record.location = point; 
touchEvent->record.windowLocation = point; 
touchEvent->record.infoSize = sizeof(GSHandInfo) + sizeof(GSPathInfo); 
touchEvent->record.timestamp = GSCurrentEventTimestamp(); 
touchEvent->record.window = winRef; 
touchEvent->record.senderPID = 919; 
bzero(&touchEvent->handInfo, sizeof(GSHandInfo)); 
bzero(&touchEvent->handInfo.pathInfos[0], sizeof(GSPathInfo)); 
GSHandInfo touchEventHandInfo; 
touchEventHandInfo._0x5C = 0; 
touchEventHandInfo.deltaX = 0; 
touchEventHandInfo.deltaY = 0; 
touchEventHandInfo.height = 0; 
touchEventHandInfo.width = 0; 
touchEvent->handInfo = touchEventHandInfo; 
touchEvent->handInfo.type = handInfoType; 
touchEvent->handInfo.deltaX = 1; 
touchEvent->handInfo.deltaY = 1; 
touchEvent->handInfo.pathInfosCount = 0; 
touchEvent->handInfo.pathInfos[0].pathIndex = 1; 
touchEvent->handInfo.pathInfos[0].pathIdentity = 2; 
touchEvent->handInfo.pathInfos[0].pathProximity = (handInfoType == kGSHandInfoTypeTouchDown || handInfoType == kGSHandInfoTypeTouchDragged || handInfoType == kGSHandInfoTypeTouchMoved) ? 0x03: 0x00; 
touchEvent->handInfo.x52 = 1; 
touchEvent->handInfo.pathInfos[0].pathLocation = point; 
touchEvent->handInfo.pathInfos[0].pathWindow = winRef; 
GSEventRecord* record = (GSEventRecord*) touchEvent; 
record->timestamp = GSCurrentEventTimestamp(); 
GSSendEvent(record, port); 

इस कोड का उपयोग करने के लिए, आपको इसे कई बार कॉल करना होगा। एक टैप के लिए, टच-डाउन, टच-ड्रैग और फिर टच-अप होते हैं।

यह भी ध्यान दें कि स्पर्श होने पर पथप्रोसिटी 0 है।

जहां तक ​​मुझे याद है, WinRef कोई फर्क नहीं पड़ता।

उम्मीद है कि इससे मदद मिलती है।

संपादित करें: Bugivore की टिप्पणी से, समस्या है:

तरह से मैं malloc के माध्यम से touchEvent आवंटित गलत था। ऐसा किया जाना चाहिए क्योंकि EntryLevelDev ने दिखाया - "स्थिर uint8_t handJob [sizeof (GSEventRecord) + sizeof (GSHandInfo) + sizeof (GSPathInfo)];"

+0

हाय ईएलडी - सहायता के लिए धन्यवाद। मैंने कोशिश की और यह objc_msgSend में दुर्घटनाग्रस्त हो गया। – Jailbroken

+0

ठीक है, कृपया मेरी परियोजना को जिथब पर देखें ... https: //github.com/entryleveldev/touchy – pt2121

+0

बहुत अच्छी तरह से काम किया! बहुत धन्यवाद। – Jailbroken

3

EntryLevelDev से उत्तर सही है, लेकिन कुछ मूल्य इतना महत्वपूर्ण नहीं है। मुझे नीचे दिए गए कोड कहीं और से मिले हैं और कुछ कोशिश और त्रुटियां कर दी हैं, यहां मेरे कोड हैं (नवीनतम आईओएस 6 तक काम करते हैं)।

और क्या कोई इस पर आईओएस 7 के लिए काम कर रहा है? मैं इसे काम नहीं कर सका। मेरी पोस्ट यहां देखें: With GSCopyPurpleNamedPort(appId) in GraphicsServices deprecated in IOS7, what is the alternative approach?

static int prev_click = 0; 

if (!click && !prev_click) 
{ 
    //which should never enter 
    NSLog(@"***error, postHandEvent cancel"); 
    return; 
} 

CGPoint location = CGPointMake(x, y); 

struct GSTouchEvent { 
    GSEventRecord record; 
    GSHandInfo handInfo; 
} * event = (struct GSTouchEvent*) &touchEvent; 
bzero(touchEvent, sizeof(touchEvent)); 

event->record.type = kGSEventHand; 
event->record.windowLocation = location; 
event->record.timestamp = GSCurrentEventTimestamp(); 
//NSLog(@"Timestamp GSCurrentEventTimestamp: %llu",GSCurrentEventTimestamp()); 
event->record.infoSize = sizeof(GSHandInfo) + sizeof(GSPathInfo); 
event->handInfo.type = getHandInfoType(prev_click, click); 

//must have the following line 
event->handInfo.x52 = 1; 

//below line is for ios4 
//event->handInfo.pathInfosCount = 1; 


bzero(&event->handInfo.pathInfos[0], sizeof(GSPathInfo)); 
event->handInfo.pathInfos[0].pathIndex  = 2; 
//following 2 lines, they are by default 
event->handInfo.pathInfos[0].pathMajorRadius = 1.0; 
event->handInfo.pathInfos[0].pathPressure = 1.0; 

//event->handInfo.pathInfos[0].pathIdentity = 2; 
event->handInfo.pathInfos[0].pathProximity = click ? 0x03 : 0x00; 
//event->handInfo.pathInfos[0].pathProximity = action; 
event->handInfo.pathInfos[0].pathLocation = location; 

// send GSEvent 
GSEventRecord *event1 = (GSEventRecord*) event; 
sendGSEvent(event1); 
+0

यह बढ़िया है। जानकार अच्छा लगा। Thx – pt2121

+0

क्या आपने कभी यह आईओएस 7 पर काम किया है? –

+1

नहीं, ग्राफिक्स सर्विसेज के साथ नहीं। हम उपयोगकर्ता स्पर्श को अनुकरण करने के लिए एक और तरीका उपयोग कर रहे हैं। – user2485972

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