2010-03-03 12 views
7

Sto scrivendo un'applicazione per Mac OS X 10.6 e versioni successive in C++. Una parte dell'applicazione deve simulare il movimento del mouse e i clic del mouse. Lo faccio attualmente pubblicando oggetti CGEvent utilizzando CGEventPost(kCGHIDEventTap, event);.Simulare il clic del mouse su Mac OS X non funziona con alcune applicazioni

Questo funziona, per la maggior parte - Posso simulare il movimento del mouse e fare clic bene, ma sembra non funzionare in alcune aree. Ad esempio:

  • In Mozilla Firefox e Safari, posso fare clic su tutti i menu, ma non posso fare clic su un collegamento all'interno di un sito Web. Quando provo, il link è evidenziato, ma il browser non segue mai il collegamento. Tuttavia, posso fare clic con il pulsante destro del mouse su un collegamento, selezionare "Apri collegamento in una nuova scheda" e tutto funziona come previsto. Risolto - la creazione dell'evento del mouse tramite CGEventCreateMouseEvent(...) fa funzionare l'evento nel browser web.
  • Posso fare clic sull'icona "Dashboard" per salire sul dashboard, ma non posso fare clic sul pulsante "i" su nessuno dei widget del dashboard. Allo stesso modo, fare clic su uno qualsiasi dei risultati di ricerca dal widget di ricerca Spotlight non funziona neanche.

Questa incoerenza riguarda i limiti dell'applicazione. Quale potrebbe essere la causa?

risposta

5

Quello che devi fare per convincere queste applicazioni che hai effettivamente generato un clic è quello di impostare esplicitamente il valore del campo "click state" sull'evento mouse su 1 (il valore predefinito è 0). Il codice seguente lo farà:

CGEventSetIntegerValueField(event, kCGMouseEventClickState, 1); 

Ha anche essere impostato a 1 per il mouse verso il basso, ma utilizzando CGEventCreateMouseEvent() piuttosto che CGEventCreate() che viene fatto per voi.

L'ho provato e funziona nei pulsanti "i" nella dashboard e nei risultati di ricerca di Spotlight.

(Per inciso, se si stesse simulando un doppio clic si avrebbe bisogno di impostare lo stato clicca per 2 sia per il mouse e mouse verso l'alto gli eventi del secondo scatto.)

+0

Brillante! Questo lo ha risolto alla perfezione. Molte grazie! – Thomi

0

Utilizzare OSXVnc. Vedo che usano CGPostMouseEvent() invece di CGPostEvent().

+1

CGPostMouseEvent è stato dichiarato obsoleto in 10.6. Grazie per il suggerimento, ma preferirei non usare funzioni deprecate. – Thomi

+2

CGPostMouseEvent() è stato sostituito con CGEventCreateMouseEvent(). Perché non usarlo? http://developer.apple.com/mac/library/documentation/Carbon/Reference/QuartzEventServicesRef/Reference/reference.html#//apple_ref/c/func/CGEventCreateMouseEvent – Taybin

+0

Il passaggio da CGEventCreate() a CGEventCreateMouseEvent() ha risolto il problema di firefox - che è strano, sto impostando gli stessi parametri dopo tutto, ma non il problema del dashboard. – Thomi

1

La maggior parte dei menu viene attivata con l'evento mouseDown. I collegamenti ipertestuali sono seguiti dopo l'evento mouseUp. Il pulsante "i" funziona solo quando il mouse è stato cliccato ma non da molto tempo. Tutto ciò sembra mostrare che hai un problema di temporizzazione, prova diversi tempi di pressatura.

+0

Questo sembra un vantaggio promettente. Ho appena calcolato il tempo tra l'invio del mouse e gli eventi del mouse - un clic tipico richiede 42 mS, che a mio parere dovrebbe essere abbastanza breve da generare un evento click piuttosto che un clic e altro o altro ... – Thomi

+0

In effetti, non è un problema di temporizzazione. Finché si imposta il conteggio dei clic, verrà eseguita qualsiasi tempistica ragionevole. –