使用 GraphicsServices.h/GSEvent 以及使用 Xcode 编译 CLI iPhone 工具
Posted
技术标签:
【中文标题】使用 GraphicsServices.h/GSEvent 以及使用 Xcode 编译 CLI iPhone 工具【英文标题】:Using GraphicsServices.h/GSEvent as well as compiling CLI iPhone tools with Xcode 【发布时间】:2010-06-10 18:35:42 【问题描述】:我将此发送给 KennyTM(在 GitHub 上有所有私有框架标头),但我想我也会在这里问一下,以防有人有一些好主意或任何方法可以帮助我。
我正在尝试编写一个命令行实用程序,它发送 GSEvent 来操作键盘、触摸/拖动屏幕上的元素以及操作硬件按钮(音量、主页、睡眠等)
我获取了 MouseSupport 代码并尝试查看它,但我找不到发送 GSEvent 的最简单方法。我希望这里有人可以帮助我。
首先,声明 GSEvent 并发送它的最简单方法是什么?我查看了 iPhone 开发 wiki,但文档非常模糊。我知道有一个紫色事件端口(?),我必须将这些事件发送到,但我不明白该怎么做。有人可以提供例如触摸坐标、键入某个键或按下硬件按钮的示例吗?
另外,如果我想让这个实用程序像 Springboard 一样操作所有应用程序,我是否必须编写或做一些特别的事情?我不知道这是否是一个特殊情况,因为我希望它在操作系统级别。理想情况下,我会通过 SSH 连接到手机,启动程序,然后它会发送 GSEvents,由任何打开的应用程序处理。
至于编译这段代码,在Xcode下有什么办法吗?我不知道我应该使用哪种项目模板(如果有的话),这让我很失望。我不需要“构建并运行”支持,我非常乐意将程序 scp 到手机上。我知道在手机上编译代码也是可行的。我在手机上拥有来自 SDK 的所有标头以及 iphone-gcc,但是在编译一些测试程序时,我仍然会收到有关找不到 mach 标头和 CoreFoundation 的错误。有没有更简单的方法来做到这一点?
最后,是否有其他指南或文学作品可供任何人指点我以了解更多相关信息?我很高兴进入开放式 iPhone 开发(我有使用官方 SDK 的经验,但我想更深入)。
感谢人们提供的所有帮助!
【问题讨论】:
嗨,肯尼,我把它发到了你的 GitHub 帐户。我找不到您的电子邮件地址或向您发送 *** PM 的方式。 啊好的,看到了。顺便说一句,Stack Overflow 上没有 PM。 我期待阅读您的回复并做更多的 iPhone 开发!希望我能在 Cydia 的 repo 上托管一些东西。 【参考方案1】:首先,声明 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 端口的名称与其捆绑 ID 相同,因此您可以使用:
mach_port_t thePortOfApp = GSCopyPurpleNamedPort("com.unknown.appBundleID");
...
mach_port_deallocate(mach_task_self(), thePortOfApp); // remember to release the port.
另外,如果我想让这个实用程序像 Springboard 一样操作所有应用程序,我是否必须编写或做一些特别的事情?
据我所知,没有。
对于另外两个,也许你应该把它们分成单独的问题。
【讨论】:
肯尼,非常感谢您回答我的问题!不幸的是,我似乎无法弄清楚如何创建其他事件。例如,使用GSSendSimpleEvent()
似乎不适用于任何 GSEventType。我试过按菜单按钮,音量键,一切。我是否误用了这个函数来假设我只需要做GSSendSimpleEvent(kGSEventLockDevice, app_port)
?你能帮我解决这个和其他硬件按钮吗?另外,您能否提供有关触摸事件和键盘事件需要包含哪些内容的信息?再次感谢!
@Peter:是的,但只有 SpringBoard 会响应 Lock 设备事件。在这种情况下使用GSEventLockDevice()
。
我明白了,还有哪些事件只能由 Springboard 处理?如果可能,您能否阐明如何以最简单的方式创建触摸事件或键盘事件?再次感谢!
肯尼,我仍在寻找最简单的方法来创建发送到正在运行的应用程序/跳板的触摸事件。你有什么建议吗?谢谢!
@KennyTM 从我们获得苹果私有框架,以及如何将它们添加到我们的应用程序中以上是关于使用 GraphicsServices.h/GSEvent 以及使用 Xcode 编译 CLI iPhone 工具的主要内容,如果未能解决你的问题,请参考以下文章
在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?
Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)