4

我想通过 MobileSubstrate 插件在 iOS 上实现系统范围的点击模拟。这个想法是能够在 iOS 5.1.1 中在系统范围内模拟触摸(第一次是单点触摸,然后是多点触摸)。

我已经成功地实现了这篇文章来模拟对特定视图的触摸,我现在希望能够在系统范围内模拟它们。

我知道我应该使用私有 MobileServices 框架来执行此操作,并且我已经在 GSEvent 上记录了自己(我还查看了 Veency 和 MouseSupport 源代码)。

我试图连接一个视图来拦截 UIEvents 并查看底层结构:

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{

    GSEventRef eventRef = (GSEventRef)[event performSelector:@selector( _gsEvent)];
    GSEventRecord record = *_GSEventGetGSEventRecord(eventRef);
    < breakpoint here to look at record >
}

结果与上面详述的旧(iOS 3)结构极为相似。

然后我尝试自己触发这些事件(在独立应用程序上,目前不是 MS 调整):

+(void)simulateTouchDown:(CGPoint)point{

    point.x = roundf(point.x);
    point.y = roundf(point.y);

    GSEventRecord record;
    memset(&record, 0, sizeof(record));

    record.type = kGSEventHand;
    record.windowLocation = point;
    record.timestamp = GSCurrentEventTimestamp();

    GSSendSystemEvent(&record);

}

现在,这根本不起作用(也不会崩溃)。

大多数代码(MouseSupport、Veency)看起来像这样

// Create & populate a GSEvent
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 = kGSHandInfoTypeTouchDown;    
event.data.info.handInfo._0x44 = 0x1;
event.data.info.handInfo._0x48 = 0x1;

event.data.info.pathPositions = 1;  

event.data.path.pathIndex = 0x01;
event.data.path.pathIdentity = 0x02;
event.data.path.pathProximity = 0x00;
event.data.path.pathLocation = event.record.windowLocation;


GSSendSystemEvent(&event.record);

仅有的 :

  • GSEventRecordInfo 未知(我找不到它可能在哪里定义)
  • 我看不出让整个赛事只通过记录的意义

请在iOS 5上经历过这个的人指导我。

4

1 回答 1

0

GSEventRecordInfo 可能是自 iOS 3.2 以来引入的(这是您链接到的图形服务标头的来源)。class-dump 在 iOS 5.1.1 上实际在您的设备上的框架,看看它是否在那里定义?

于 2012-07-16T12:39:42.883 回答