2010-06-10 57 views
3

我把它發給了KennyTM(在GitHub上有所有的私有框架頭文件),但我想我也會問這裏以防萬一有人有一些好點子或以任何方式幫助我。使用GraphicsServices.h/GSEvent以及用Xcode編譯CLI iPhone工具

我試圖寫的命令行實用程序,發送到GSEvents屏幕操作鍵盤,觸摸/拖曳元件,和操作硬件按鈕(體積,家庭,睡眠等)

我抓起MouseSupport代碼,並試圖通過它,但我找不到發送GSEvents最簡單的方法。我希望這裏有人能幫助我。

首先,聲明一個GSEvent併發送它最簡單的方法是什麼?我看了一下iPhone開發wiki,但文檔非常模糊。我知道有一個紫色事件端口(?),我必須發送這些事件,但我不明白該怎麼做。有人可以提供例如觸摸座標,鍵入特定鍵或按下硬件按鈕的例子嗎?

此外,如果我希望此實用程序可以運行所有應用程序以及Springboard,那麼是否必須編寫或執行任何特殊的操作?我不知道這是否是特例,因爲我希望在操作系統級別。理想情況下,我會SSH進入手機,啓動程序,並且它會發送GSEvent,這些GSEvent將由任何應用程序打開處理。

就編譯這段代碼而言,有沒有辦法在Xcode下這樣做?我不知道我應該使用什麼類型的項目模板(如果有的話),這會讓我失望。我不需要「建立和去」的支持,我很樂意將這個計劃轉到電話上。我明白編譯代碼在手機上也是可行的。我在手機上使用了SDK中的所有頭文件以及iphone-gcc,但是當編譯一些測試程序時,我仍然收到有關找不到mach頭文件和CoreFoundation的錯誤。有沒有更簡單的方法來做到這一點?

最後,有沒有其他指南或文獻,任何人都可以指向我瞭解更多關於此?我很高興能夠進入開放的iPhone開發(我有官方SDK的經驗,但我想深入)。

感謝您提供的任何和所有幫助!

+0

你呢? ______ – kennytm 2010-06-10 18:53:23

+0

嗨肯尼,我把它發送到你的GitHub帳戶。我無法找到您的電子郵件地址或向您發送StackOverflow PM的方式。 – 2010-06-10 18:56:43

+0

好的,看過了。順便說一下,堆棧溢出沒有PM。 – kennytm 2010-06-10 18:58:42

回答

2

首先,聲明一個GSEvent併發送它最簡單的方法是什麼?

它取決於GSEvent的類型。一些事件具有可以一步創建和發送的便利功能,例如, GSEventLockDevice()。但是HID事件(觸摸,按鍵等)沒有這些簡單的功能。原因可能是因爲GSEventLockDevice()等將被髮送該應用程序到SpringBoard,但HID事件發送 SpringBoard到一個應用程序。因此,只有SpringBoard團隊需要知道如何構建一個複雜的GSEvent。

無論如何,要創建HID事件(例如,加速度計事件),您不需要創建GSEvent。只需使用GSSendEvent()

// (not tested.) 

GSAccelerometerInfo accel = {0.0f, 0.0f, 1.0f}; 
GSEventRecord header; 
memset(&header, 0, sizeof(header)); 
header.type = kGSEventAccelerate; 
header.infoSize = sizeof(accel); 
header.timestamp = mach_absolute_time(); 
// fill in other members. 

struct { 
    GSEventRecord record; 
    GSAccelerometerInfo info; 
} record = {header, accel}; 

// ... see below ... 

GSSendEvent(&record, thePortOfApp); 

但什麼是「應用程序的端口」?不幸的是,沒有功能可以實現。截至3日。1,馬赫端口的名稱是一樣的捆綁ID,所以你可以使用:

mach_port_t thePortOfApp = GSCopyPurpleNamedPort("com.unknown.appBundleID"); 
... 
mach_port_deallocate(mach_task_self(), thePortOfApp); // remember to release the port. 

而且,我必須寫或做什麼特別的,如果我想這個工具來操作所有的應用程序以及Springboard?

據我所知,沒有。


對於另外兩個,可能你應該把它們分成單獨的問題。

+0

Kenny, 非常感謝您回答我的問題!我不幸似乎無法弄清楚如何創建其他事件。例如,使用'GSSendSimpleEvent()'似乎不適用於任何GSEventType。我試過菜單按鈕,音量鍵,一切。我是否濫用這個函數來假設我只需要執行'GSSendSimpleEvent(kGSEventLockDevice,app_port)'?你能幫我解決這個問題和其他硬件按鈕嗎?另外,您能否提供有關觸摸事件和鍵盤事件需要包含的信息?再次感謝! – 2010-06-11 13:51:03

+0

@Peter:是的,但只有SpringBoard纔會響應鎖定設備事件。在這種情況下使用'GSEventLockDevice()'。 – kennytm 2010-06-11 17:40:33

+0

我看到,Springboard只能處理哪些其他事件? 如果可能,您能否以最簡單的方式闡明如何創建觸摸事件或鍵盤事件?再次感謝! – 2010-06-11 18:51:57