Domanda

L'ho inviato a KennyTM (ha tutte le intestazioni del framework privato su GitHub) ma ho pensato di chiedere anche qui nel caso qualcuno avesse qualche buona idea o qualche modo per aiutarmi.

Sto cercando di scrivere un'utilità da riga di comando che invii GSEvents per azionare la tastiera, toccare/trascinare elementi sullo schermo e azionare i pulsanti hardware (volume, home, sospensione, ecc.)

Ho preso il codice MouseSupport e ho provato a esaminarlo, ma non sono riuscito a trovare il modo più semplice per inviare GSEvents.Spero che qualcuno qui possa aiutarmi.

Innanzitutto, qual è il modo più semplice per dichiarare un GSEvent e inviarlo?Ho guardato il wiki di sviluppo dell'iPhone, ma la documentazione era molto vaga.Capisco che esiste una porta eventi viola (?) a cui devo inviare questi eventi, ma non capisco come farlo.Qualcuno potrebbe offrire esempi, ad esempio, per toccare una coordinata, digitare un determinato tasto o premere un pulsante hardware?

Inoltre, devo scrivere o fare qualcosa di speciale se voglio che questa utility funzioni con tutte le applicazioni e con Springboard?Non so se questo è un caso speciale perché lo voglio a livello di sistema operativo.Idealmente, entrerei nel telefono tramite SSH, avvierei il programma e invierebbe GSEvents che verrebbero gestiti da qualunque applicazione fosse aperta.

Per quanto riguarda la compilazione di questo codice, c'è un modo per farlo sotto Xcode?Non so che tipo di modello di progetto dovrei usare (se presente) e questo mi sconcerta.Non ho bisogno del supporto "build and go", sono più che felice di inviare il programma al telefono.Capisco che la compilazione del codice è fattibile anche al telefono.Ho tutte le intestazioni dell'SDK sul mio telefono insieme a iphone-gcc, ma durante la compilazione di alcuni programmi di test ricevo ancora errori relativi alla mancata ricerca delle intestazioni mach e CoreFoundation.C'è un modo più semplice per farlo?

Infine, ci sono altre guide o pezzi di letteratura a cui qualcuno può indicarmi per saperne di più a riguardo?Sono entusiasta di dedicarmi allo sviluppo aperto di iPhone (ho esperienza con l'SDK ufficiale, ma voglio approfondire).

Grazie per tutto l'aiuto che le persone possono offrire!

È stato utile?

Soluzione

Innanzitutto, qual è il modo più semplice per dichiarare un GSEvent e inviarlo?

Dipende dal tipo di GSEvent.Alcuni eventi dispongono di comode funzioni che possono essere create e inviate in un unico passaggio, ad es. GSEventLockDevice().Ma gli eventi HID (tocchi, pressioni di tasti, ecc.) non hanno queste semplici funzioni.Il motivo è probabilmente perché GSEventLockDevice() ecc. devono essere inviati da l'app a SpringBoard, ma vengono inviati eventi HID da SpringBoard in un'app.Pertanto, solo il team SpringBoard deve sapere come costruire un complicato GSEvent.

In ogni caso, per creare un evento HID (es.evento dell'accelerometro) non è necessario creare un GSEvent.Basta usare 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);

Ma cos'è "il porto delle app"?Sfortunatamente non esiste alcuna funzione per ottenerlo.A partire dalla 3.1, il nome della porta mach è lo stesso dell'ID del bundle, quindi potresti utilizzare:

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

Inoltre, devo scrivere o fare qualcosa di speciale se voglio che questa utility funzioni con tutte le applicazioni e con Springboard?

Per quanto ne so, no.


Per gli altri due, probabilmente dovresti dividerli in domande individuali.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top