使用GraphicsServices.h / GSEvent以及使用Xcode编译CLI iPhone工具

时间:2010-06-10 18:35:42

标签: iphone xcode iphone-sdk-3.0 jailbreak iphone-sdk-3.1.3

我把它发送给了KennyTM(在GitHub上有所有的私有框架标题),但我想我也会在这里问,以防有人有一些好的想法或任何方式来帮助我。

我正在尝试编写一个命令行实用程序,它发送GSEvents来操作键盘,触摸/拖动屏幕上的元素,以及操作硬件按钮(音量,家庭,睡眠等)

我抓住了MouseSupport代码并尝试查看它,但我找不到发送GSEvents的最简单方法。我希望有人可以帮助我。

首先,声明GSEvent并发送它的最简单方法是什么?我查看了iPhone开发维基,但文档很模糊。我知道有一个紫色的事件端口(?),我必须发送这些事件,但我不明白该怎么做。有人可以提供例如触摸坐标,键入某个键或按下硬件按钮的示例吗?

另外,如果我希望此实用程序能够操作所有应用程序以及Springboard,我是否必须编写或执行任何特殊操作?我不知道这是否是一个特例,因为我想要它在操作系统级别。理想情况下,我会通过SSH连接到手机,启动程序,它会发送任何应用程序打开的GSEvents。

至于编译这段代码,有没有办法在Xcode下这样做?我不知道我应该使用什么样的项目模板(如果有的话),这让我失望了。我不需要“建立和去”支持,我很乐意将程序scp到手机上。我知道编译代码在手机上也是可行的。我在手机上的SDK和iphone-gcc都有所有标题,但是在编译一些测试程序时,我仍然会发现有关找不到mach头和CoreFoundation的错误。有更简单的方法吗?

最后,是否还有其他指南或文献可供任何人指点我学习更多相关内容?我很高兴进入开放的iPhone开发(我有使用官方SDK的经验,但我想更深入)。

感谢人们提供的任何和所有帮助!

1 个答案:

答案 0 :(得分: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开始,mach端口的名称与其bundle ID相同,因此您可以使用:

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

  

此外,如果我希望此实用程序能够操作所有应用程序以及Springboard,我是否必须编写或执行任何特殊操作?

据我所知,没有。


对于其他两个,可能你应该将它们分成单独的问题。