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でこれを経験した人が私を案内してください。