iPhone模拟触屏实现事件教程

移动开发 iOS
本文介绍的iPhone模拟触屏实现事件教程,主要介绍了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.     GSEventType type; // 0x8     
  3.     GSEventSubType subtype; // 0xC     
  4.     CGPoint location;   // 0x10     
  5.     CGPoint windowLocation; // 0x18     
  6.     int windowContextId;    // 0x20     
  7.     uint64_t timestamp; // 0x24, from mach_absolute_time     
  8.     GSWindowRef window; // 0x2C     
  9.     GSEventFlags flags; // 0x30     
  10.     unsigned senderPID; // 0x34     
  11.     CFIndex infoSize; // 0x38     
  12. } GSEventRecord;    
  13.  
  14. typedef struct GSEventRecord {  
  15.  GSEventType type; // 0x8  
  16.  GSEventSubType subtype; // 0xC  
  17.  CGPoint location;  // 0x10  
  18.  CGPoint windowLocation; // 0x18  
  19.  int windowContextId; // 0x20  
  20.  uint64_t timestamp; // 0x24, from mach_absolute_time  
  21.  GSWindowRef window; // 0x2C  
  22.  GSEventFlags flags; // 0x30  
  23.  unsigned senderPID; // 0x34  
  24.  CFIndex infoSize; // 0x38  
  25. } GSEventRecord; 

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

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

C代码 

  1. #import "GSEvent.h"     
  2. #include <mach/mach_time.h>     
  3. void sendclickevent(){     
  4.     mach_port_t thePortOfApp = GSCopyPurpleNamedPort("com.fuckyou.fuck");     
  5.          
  6.     GSEventRecord header;     
  7.     GSHandInfo click;     
  8.     GSPathInfo pathInfo = {2,2,2,1,1,{50,50}, NULL};     
  9.          
  10.     bzero(&header, sizeof(header));     
  11.     bzero(&click, sizeof(click));     
  12.     
  13.     header.type = kGSEventHand;     
  14.     header.subtype = kGSEventSubTypeUnknown;     
  15.     header.location.x = 50;     
  16.     header.location.y = 50;     
  17.     header.windowLocation.x = 50;     
  18.     header.windowLocation.y = 50;     
  19.     header.infoSize = sizeof(GSHandInfo)+sizeof(GSPathInfo);     
  20.     header.timestamp = mach_absolute_time();     
  21.     
  22.     click.type = kGSHandInfoTypeTouchDown;     
  23.     click.deltaX = 1;     
  24.     click.deltaY = 1;     
  25.     click.pathInfosCount = 1;     
  26.          
  27.     struct    
  28.     {     
  29.         GSEventRecord record;     
  30.         GSHandInfo hand;     
  31.         GSPathInfo path;     
  32.     } record = {header, click, pathInfo};     
  33.          
  34.     GSSendEvent(&record, thePortOfApp);     
  35. }    
  36.  
  37. #import "GSEvent.h"  
  38. #include <mach/mach_time.h> 
  39. void sendclickevent(){  
  40.     mach_port_t thePortOfApp = GSCopyPurpleNamedPort("com.fuckyou.fuck");  
  41.       
  42.     GSEventRecord header;  
  43.     GSHandInfo click;  
  44.     GSPathInfo pathInfo = {2,2,2,1,1,{50,50}, NULL};  
  45.       
  46.     bzero(&header, sizeof(header));  
  47.     bzero(&click, sizeof(click));  
  48.  
  49.     header.type = kGSEventHand;  
  50.     header.subtype = kGSEventSubTypeUnknown;  
  51.     header.location.x = 50;  
  52.     header.location.y = 50;  
  53.     header.windowLocation.x = 50;  
  54.     header.windowLocation.y = 50;  
  55.     header.infoSize = sizeof(GSHandInfo)+sizeof(GSPathInfo);  
  56.     header.timestamp = mach_absolute_time();  
  57.  
  58.     click.type = kGSHandInfoTypeTouchDown;  
  59.     click.deltaX = 1;  
  60.     click.deltaY = 1;  
  61.     click.pathInfosCount = 1;  
  62.       
  63.     struct  
  64.     {  
  65.         GSEventRecord record;  
  66.         GSHandInfo hand;  
  67.         GSPathInfo path;  
  68.     } record = {header, click, pathInfo};  
  69.       
  70.     GSSendEvent(&record, thePortOfApp);  

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

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

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

Objective-c代码 

  1. GSEventRecord header;     
  2. GSHardwareKeyInfo key = {0,0,0,0,1,{'a'},1,{'a'},0,0,0,0};     
  3. memset(&header, 0, sizeof(header));     
  4.     
  5. header.type = kGSEventKeyDown;     
  6. header.infoSize = sizeof(GSHardwareKeyInfo);     
  7. header.timestamp = mach_absolute_time();     
  8.     
  9. struct     
  10. {     
  11.     GSEventRecord header1;     
  12.     GSHardwareKeyInfo key1;     
  13. }fuck = {header, key};     
  14. GSSendEvent(&fuck, GSGetPurpleApplicationPort());    
  15.  
  16.     GSEventRecord header;  
  17.     GSHardwareKeyInfo key = {0,0,0,0,1,{'a'},1,{'a'},0,0,0,0};  
  18.     memset(&header, 0, sizeof(header));  
  19.       
  20.     header.type = kGSEventKeyDown;  
  21.     header.infoSize = sizeof(GSHardwareKeyInfo);  
  22.     header.timestamp = mach_absolute_time();  
  23.       
  24.     struct  
  25.     {  
  26.         GSEventRecord header1;  
  27.         GSHardwareKeyInfo key1;  
  28.     }fuck = {header, key};  
  29.     GSSendEvent(&fuck, GSGetPurpleApplicationPort()); 

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

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

小结:iPhone模拟触屏实现事件教程的内容介绍完了,希望本文对你有所帮助!更多相关内容请参考编辑推荐。

责任编辑:zhaolei
相关推荐

2011-06-08 14:26:21

OMSOphoneiPhone

2014-04-29 13:58:11

OpenGL ESAndroid响应触屏事件

2011-07-13 09:32:05

苹果iOS 5

2011-07-21 15:56:32

iPhone 截屏

2011-07-25 14:44:41

iPhone iPhone开发 截屏

2009-05-28 09:35:52

2014-02-10 09:30:14

Windows 8.1

2011-03-21 15:23:24

触屏网页设计

2013-01-11 13:30:38

触屏智能手机新闻阅读

2010-09-10 10:09:26

Android

2011-07-25 15:32:06

iPhone Table 动态

2009-11-04 08:56:03

Windows 7触摸屏

2011-05-10 17:19:06

戴尔评测

2012-03-23 10:27:08

触屏手机点击区域

2015-07-28 16:57:52

触屏手机键盘功能机

2011-04-29 14:24:48

戴尔Insprion

2012-02-29 14:32:18

LifeSize触屏会议电话视频会议

2012-02-02 16:35:42

Silverlight低级别触屏处理

2011-04-28 08:59:13

2012-11-12 12:02:04

笔记本
点赞
收藏

51CTO技术栈公众号