iPhone模拟触屏实现教程

本文介绍了如何在iPhone上通过越狱设备及PrivateFramework模拟触屏事件,包括发送事件消息和键盘输入,提供了详细的C代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

iPhone模拟触屏实现事件教程

iPhone模拟触屏实现事件教程是本文呀介绍的内容,不多说,我们先来看内容。目前又有了一个想在iPhone上做协助调试的设想,当然控制权什么的是别说了,就是做一些协助方在自己屏幕上点点划划,被协助方也要有同样的操作,因为被调试程序的不确定性,那只能做成发送各种针对屏幕的模拟事件了。

因为apple没有放出直接发送触屏事件等的API,所以用的都是越狱的iPhone加上PrivateFramework,根本没指望上市,反正就是为了内部调试。

首先在kennytm的网站拔下私有framework的头文件,就本应用而言,只需要GrapicsServices文件夹以及Availability2.h即可。然后导入Xcode目录下Platforms下对应的GraphicsService.framework,准备工作就OK了。

发送事件消息,主要是构造GSEventRecord,简单的事件可能只需要填充GSEventRecord里面的type类型参数,再复杂一些的就需要在结构的后面继续填充,填充大小必须在infoSize参数里指定

C代码

  1. typedef struct GSEventRecord{
  2. GSEventTypetype;//0x8
  3. GSEventSubTypesubtype;//0xC
  4. CGPointlocation;//0x10
  5. CGPointwindowLocation;//0x18
  6. intwindowContextId;//0x20
  7. uint64_ttimestamp;//0x24,frommach_absolute_time
  8. GSWindowRefwindow;//0x2C
  9. GSEventFlagsflags;//0x30
  10. unsignedsenderPID;//0x34
  11. CFIndexinfoSize;//0x38
  12. }GSEventRecord;

头文件里没有提供一些便捷方法构造复杂的信息结构,这和public API真是云泥之别。不过一些非常简单的消息还是可以直接调用的,如void GSEventLockDevice();就相当与构造了一个type为kGSEventLockDevice的GSEventRecord结构再将其发送出去。

用一个稍微复杂的例子,我们向屏幕的{50,50}坐标处发送一个“按下”的指令

C代码

  1. #import"GSEvent.h"
  2. #include<mach/mach_time.h>
  3. void sendclickevent(){
  1. mach_port_t thePortOfApp = GSCopyPurpleNamedPort("com.goodyou.good"); //获取发送应用的的端口
  2. GSEventRecord header;
  3. GSHandInfo click;
  4. GSPathInfo pathInfo={2,2,2,1,1,{50,50},NULL};
  5. bzero(&header,sizeof(header));
  6. bzero(&click,sizeof(click));
  7. header.type=kGSEventHand; //手势
  8. header.subtype=kGSEventSubTypeUnknown;
  9. header.location.x=50;
  10. header.location.y=50;
  11. header.windowLocation.x=50;
  12. header.windowLocation.y=50;
  13. header.infoSize=sizeof(GSHandInfo)+sizeof(GSPathInfo);
  14. header.timestamp=mach_absolute_time();
  15. click.type=kGSHandInfoTypeTouchDown; //屏幕触摸事件
  16. click.deltaX=1;
  17. click.deltaY=1;
  18. click.pathInfosCount=1;
  19. struct
  20. {
  21. GSEventRecordrecord;
  22. GSHandInfohand;
  23. GSPathInfopath;
  24. }record={header,click,pathInfo};
  25. GSSendEvent(&record,thePortOfApp);
  26. }

里面需要注意的是向某应用发送事件,必须获得该应用的端口,也就是第一行代码。而发送复杂的信息必须要将若干信息体拼接到一起,自己定义一写需要的结构体比较合适,并正确填写信息体的大小,这些技巧仿佛回到了蛮荒时代。我本身看到0长数组,顺手就在堆上构造结构了,但这些消息的处理是异步的,我也不清楚何时可以安全地回收内存,所以建议还是使用结构体拼凑的方法。

除了触屏之外,另一个非常重要的就是键盘输入了,但是iPhone的输入的特殊性,不太好说是键盘输入,反正就是那个意思。

具体编码过程其实和触屏事件没什么两样,不过如果把GSHardwareKeyInfo或者GSKeyInfo这种似乎是键盘事件的结构名放google上搜索,一个结果都没有,一开始我还想凑,花了两三天实在凑不出来了发现其实可以逆向来嘛,用GSEventCreateKeyEvent创造一个键盘事件,然后解析它就是,于是这样才搞定,而且可悲的发现其实我想得太多了,里面绝大多数成员填0就行了,没必要为编码区这些东西烦恼。

Objective-c代码

  1. GSEventRecord header;
  2. GSHardwareKey Infokey={0,0,0,0,1,{'a'},1,{'a'},0,0,0,0};
  3. memset(&header,0,sizeof(header));
  4. header.type = kGSEventKeyDown; //键盘事件
  5. header.infoSize = sizeof(GSHardwareKeyInfo);
  6. header.timestamp = mach_absolute_time();
  7. struct
  8. {
  9. GSEventRecordheader1;
  10. GSHardwareKeyInfokey1;
  11. }fuck={header,key};
  12. GSSendEvent(&fuck,GSGetPurpleApplicationPort());

这样就可以输入一个a了,前提是光标必须在输入框内。

当然后续问题还有很多,这实际上不过是自己的程序向自己的发送事件而已,后面需要做的是程序运行到后台时向前台程序甚至是主界面发事件,能否做到,我也不敢肯定。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值