2010-06-10 20 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