成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

iPhone模擬觸屏實現(xiàn)事件教程

移動開發(fā) iOS
本文介紹的iPhone模擬觸屏實現(xiàn)事件教程,主要介紹了iphone中事件的問題,我們來看內(nèi)容。

iPhone模擬觸屏實現(xiàn)事件教程是本文呀介紹的內(nèi)容,不多說,我們先來看內(nèi)容。目前又有了一個想在iPhone上做協(xié)助調(diào)試的設(shè)想,當(dāng)然控制權(quán)什么的是別說了,就是做一些協(xié)助方在自己屏幕上點點劃劃,被協(xié)助方也要有同樣的操作,因為被調(diào)試程序的不確定性,那只能做成發(fā)送各種針對屏幕的模擬事件了。

因為apple沒有放出直接發(fā)送觸屏事件等的API,所以用的都是越獄的iPhone加上PrivateFramework,根本沒指望上市,反正就是為了內(nèi)部調(diào)試。

首先在kennytm的網(wǎng)站拔下私有framework的頭文件,就本應(yīng)用而言,只需要GrapicsServices文件夾以及Availability2.h即可。然后導(dǎo)入Xcode目錄下Platforms下對應(yīng)的GraphicsService.framework,準備工作就OK了。

發(fā)送事件消息,主要是構(gòu)造GSEventRecord,簡單的事件可能只需要填充GSEventRecord里面的type類型參數(shù),再復(fù)雜一些的就需要在結(jié)構(gòu)的后面繼續(xù)填充,填充大小必須在infoSize參數(shù)里指定

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; 

頭文件里沒有提供一些便捷方法構(gòu)造復(fù)雜的信息結(jié)構(gòu),這和public API真是云泥之別。不過一些非常簡單的消息還是可以直接調(diào)用的,如void GSEventLockDevice();就相當(dāng)與構(gòu)造了一個type為kGSEventLockDevice的GSEventRecord結(jié)構(gòu)再將其發(fā)送出去。

用一個稍微復(fù)雜的例子,我們向屏幕的{50,50}坐標處發(fā)送一個“按下”的指令

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);  

里面需要注意的是向某應(yīng)用發(fā)送事件,必須獲得該應(yīng)用的端口,也就是第一行代碼。而發(fā)送復(fù)雜的信息必須要將若干信息體拼接到一起,自己定義一寫需要的結(jié)構(gòu)體比較合適,并正確填寫信息體的大小,這些技巧仿佛回到了蠻荒時代。我本身看到0長數(shù)組,順手就在堆上構(gòu)造結(jié)構(gòu)了,但這些消息的處理是異步的,我也不清楚何時可以安全地回收內(nèi)存,所以建議還是使用結(jié)構(gòu)體拼湊的方法。

除了觸屏之外,另一個非常重要的就是鍵盤輸入了,但是iPhone的輸入的特殊性,不太好說是鍵盤輸入,反正就是那個意思。

具體編碼過程其實和觸屏事件沒什么兩樣,不過如果把GSHardwareKeyInfo或者GSKeyInfo這種似乎是鍵盤事件的結(jié)構(gòu)名放google上搜索,一個結(jié)果都沒有,一開始我還想湊,花了兩三天實在湊不出來了發(fā)現(xiàn)其實可以逆向來嘛,用GSEventCreateKeyEvent創(chuàng)造一個鍵盤事件,然后解析它就是,于是這樣才搞定,而且可悲的發(fā)現(xiàn)其實我想得太多了,里面絕大多數(shù)成員填0就行了,沒必要為編碼區(qū)這些東西煩惱。

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了,前提是光標必須在輸入框內(nèi)。

當(dāng)然后續(xù)問題還有很多,這實際上不過是自己的程序向自己的發(fā)送事件而已,后面需要做的是程序運行到后臺時向前臺程序甚至是主界面發(fā)事件,能否做到,我也不敢肯定。

小結(jié):iPhone模擬觸屏實現(xiàn)事件教程的內(nèi)容介紹完了,希望本文對你有所幫助!更多相關(guān)內(nèi)容請參考編輯推薦。

責(zé)任編輯:zhaolei
相關(guān)推薦

2011-06-08 14:26:21

OMSOphoneiPhone

2014-04-29 13:58:11

OpenGL ESAndroid響應(yīng)觸屏事件

2011-07-13 09:32:05

蘋果iOS 5

2011-07-25 14:44:41

iPhone iPhone開發(fā) 截屏

2011-07-21 15:56:32

iPhone 截屏

2009-05-28 09:35:52

2013-01-11 13:30:38

觸屏智能手機新聞閱讀

2014-02-10 09:30:14

Windows 8.1

2011-03-21 15:23:24

觸屏網(wǎng)頁設(shè)計

2011-07-25 15:32:06

iPhone Table 動態(tài)

2010-09-10 10:09:26

Android

2009-11-04 08:56:03

Windows 7觸摸屏

2011-04-29 14:24:48

戴爾Insprion

2012-02-29 14:32:18

LifeSize觸屏?xí)h電話視頻會議

2011-05-10 17:19:06

戴爾評測

2012-03-23 10:27:08

觸屏手機點擊區(qū)域

2015-07-28 16:57:52

觸屏手機鍵盤功能機

2011-07-21 16:48:19

iPhone 游戲

2011-08-10 15:48:10

iPhone網(wǎng)絡(luò)

2011-08-12 13:19:24

iPhoneSDK安裝
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 一区二区三区视频在线免费观看 | 搞av.com | 秋霞电影院午夜伦 | 欧美午夜剧场 | 一级黄片一级毛片 | 成人av在线播放 | 在线视频一区二区三区 | 欧美另类视频 | 色婷婷一区 | 亚洲三区在线播放 | 瑟瑟免费视频 | 日韩综合一区 | 国内自拍视频在线观看 | 国产资源在线观看 | 91麻豆精品国产91久久久久久 | 欧美激情综合五月色丁香小说 | 欧美日韩一区二区三区四区 | 在线成人av | 欧美另类视频在线 | 精品一区二区三区中文字幕 | 久久久免费观看视频 | 国产一区二区三区四区 | 久久99视频精品 | 日本特黄a级高清免费大片 国产精品久久性 | 国产精品久久久久久久久久久久久久 | 日韩精品国产精品 | 在线播放中文字幕 | 国产在线精品一区 | 国产精品久久 | 亚洲一区在线播放 | 日韩在线免费视频 | www.婷婷亚洲基地 | 欧美日韩亚洲国产 | 99精品在线观看 | 欧美性影院 | 久久久久久影院 | 国产精品国产成人国产三级 | 亚洲精品电影 | 亚洲视频www| www亚洲精品| 国产ts人妖系列高潮 |