3

我将此发送给 KennyTM(在 GitHub 上有所有私有框架标头),但我想我也会在这里问一下,以防有人有一些好主意或任何方法可以帮助我。

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

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

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

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

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

最后,是否有其他指南或文学作品可供任何人指出我以了解更多相关信息?我很高兴进入开放式 iPhone 开发(我有使用官方 SDK 的经验,但我想更深入)。

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

4

1 回答 1

2

首先,声明 GSEvent 并发送它的最简单方法是什么?

这取决于 GSEvent 的类型。一些事件具有可以在一个步骤中创建和发送的便捷功能,例如GSEventLockDevice()。但是 HID 事件(触摸、按键等)没有这些简单的功能。原因可能是因为GSEventLockDevice()etc要从应用程序发送到 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 端口的名称与其捆绑 ID 相同,因此您可以使用:

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

另外,如果我想让这个实用程序运行所有应用程序以及 Springboard,我是否必须编写或做任何特别的事情?

据我所知,没有。


对于另外两个,您可能应该将它们分成单独的问题。

于 2010-06-10T19:37:20.570 回答