Use GSEvent to send touch event, but it is not valid

The code for sending a touch event to my GSEvent application, get mach_port_t with GSCopyPurpleSystemEventPort ().

the submit function was started after the ApplicationDidFinishLaunch: UIControlView application option completed.

follow these steps:

void handleMouseEventAtPoint(CGPoint point, int buttons) { // NOTE: Must store button state for comparision, port for // mouse dragging and button up static int buttons_; static mach_port_t port_; int diff = buttons_ ^ buttons; bool twas = ((buttons_ & 0x1) != 0); bool tis = ((buttons & 0x1) != 0); buttons_ = buttons; // Round point values to prevent subpixel coordinates point.x = roundf(point.x); point.y = roundf(point.y); // Check for mouse button events mach_port_t purple; if ((diff & 0x10) != 0) { // Simulate Headset button press struct GSEventRecord record; memset(&record, 0, sizeof(record)); record.type = (buttons & 0x4) != 0 ? kGSEventHeadsetButtonDown : kGSEventHeadsetButtonUp; record.timestamp = GSCurrentEventTimestamp(); FixRecord(&record); GSSendSystemEvent(&record); } if ((diff & buttonThree) != 0) { // Simulate Home button press struct GSEventRecord record; memset(&record, 0, sizeof(record)); record.type = (buttons & buttonThree) != 0 ? kGSEventMenuButtonDown : kGSEventMenuButtonUp; record.timestamp = GSCurrentEventTimestamp(); FixRecord(&record); GSSendSystemEvent(&record); } if ((diff & buttonTwo) != 0) { // Simulate Sleep/Wake button press struct GSEventRecord record; memset(&record, 0, sizeof(record)); record.type = (buttons & buttonTwo) != 0 ? kGSEventLockButtonDown : kGSEventLockButtonUp; record.timestamp = GSCurrentEventTimestamp(); FixRecord(&record); GSSendSystemEvent(&record); } if (twas != tis || tis) { // Main (left button) state changed, or was dragged struct { struct GSEventRecord record; struct { struct GSEventRecordInfo info; struct GSPathInfo path; } data; } event; memset(&event, 0, sizeof(event)); event.record.type = kGSEventHand; event.record.windowLocation = point; event.record.timestamp = GSCurrentEventTimestamp(); event.record.infoSize = sizeof(event.data); event.data.info.handInfo.type = twas == tis ? kGSHandInfoTypeTouchDragged : tis ? kGSHandInfoTypeTouchDown : kGSHandInfoTypeTouchUp; event.data.info.handInfo._0x44 = 0x1; event.data.info.handInfo._0x48 = tis ? 0x1 : 0x0; event.data.info.pathPositions = 1; event.data.path.pathIndex = 0x01; event.data.path.pathIdentity = 0x02; event.data.path.pathProximity = tis ? 0x03 : 0x00; event.data.path.pathLocation = event.record.windowLocation; if (twas != tis && tis) { // Button down and was not down before port_ = 0; CAWindowServer *server; server = [CAWindowServer serverIfRunning]; char svrptrstr [255]; sprintf(svrptrstr, "%p", server); NSLog(@"One!"); if (server = [CAWindowServer serverIfRunning]) //if (true) { NSLog(@"Two!"); //NSArray *displays([server displays]); NSArray *displays = [server displays]; if (displays != nil && [displays count] != 0) { NSLog(@"Three!"); //CAWindowServer *display; if (CAWindowServerDisplay *display = [displays objectAtIndex:0]) { NSLog(@"Four!"); port_ = [display clientPortAtPosition:point]; } } } if (port_ == 0) { // Is SpringBoard if (purple == 0) { purple = GSGetPurpleSystemEventPort(); port_ = purple; } } } FixRecord(&event.record); GSSendEvent(&event.record, port_); NSLog(@"Event sent!"); //GSSendSystemEvent(&event.record); //GSSendEvent(&event.record, purple); } if (purple != 0 && PurpleAllocated) { mach_port_deallocate(mach_task_self(), purple); NSLog(@"Deallocated mach_port!"); } } 

but launching the application on ipad2 jailbreak (iOS5.01), there is no click result, if the click event was done, there will be debug.log.

who can tell me what i missed?

0
ios iphone iphone-privateapi
Apr 23 '12 at 3:17
source share
1 answer

I saw this code somewhere else (I think it was in an application that translated mouse clicks on iPhone / iPad). The problem here is not in the code or port, but in the structure of the events you are sending. This is the GSevent framework for iOS 3.0, not iOS 5.0. It has changed not only in structure, but also in values ​​and tags. I suggest getting UIEvents by translating them into GSEvents and looking at their content.

0
Apr 30 '12 at 7:40
source share
β€” -



All Articles