2010-04-08 11 views
2

Je suis en train de développer une sorte d'application de souris pour la plateforme iPhone. Cette application se connecte à un service informatique qui génère des événements de souris sur Mac OS X. Je génère ces événements avec CGEventCreateMouseEvent() et CGEventPost(). Mais j'ai rencontré un problème. Imaginons que vous utilisiez Safari et que vous cliquiez sur l'espace de bureau libre. Si vous le faites avec une souris normale, elle cachera la barre de menu supérieure de Safari et affichera la barre de menus du Finder. Mais sur ces événements synthétiques, cela n'agit pas comme ça. Dois-je poster un autre événement ou définir des propriétés supplémentaires?Le clic synthétique ne fait pas changer la barre de menu de l'application (Mac OS X)

Voici mon code jusqu'à la souris, la souris vers le bas:

- (void)mouseUp:(int)button { 
    int type = (button == LEFT_BUTTON) ? kCGEventLeftMouseUp : kCGEventRightMouseUp; 
    int mouseButton = (button == LEFT_BUTTON) ? kCGMouseButtonLeft : kCGMouseButtonRight; 
    leftMouseDown = (button == LEFT_BUTTON) ? NO : leftMouseDown; 
    rightMouseDown = (button == RIGHT_BUTTON) ? NO : rightMouseDown; 
    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState); 
    CGEventRef event = CGEventCreateMouseEvent (source, type, CGSCurrentInputPointerPosition(), mouseButton); 
    CGEventSetType(event, type); 
    CGEventPost(kCGHIDEventTap, event); 
    CFRelease(event); 
} 
- (void)mouseDown:(int)button { 
    int type = (button == LEFT_BUTTON) ? kCGEventLeftMouseDown : kCGEventRightMouseDown; 
    int mouseButton = (button == LEFT_BUTTON) ? kCGMouseButtonLeft : kCGMouseButtonRight; 
    leftMouseDown = (button == LEFT_BUTTON) ? YES : leftMouseDown; 
    rightMouseDown = (button == RIGHT_BUTTON) ? YES : rightMouseDown; 
    CGEventSourceRef source = CGEventSourceCreate(kCGEventSourceStateHIDSystemState); 
    CGEventRef event = CGEventCreateMouseEvent (source, type, CGSCurrentInputPointerPosition(), mouseButton); 
    CGEventSetType(event, type); 
    CGEventPost(kCGHIDEventTap, event); 
    CFRelease(event); 
} 

Répondre

2

Vous pouvez essayer CGPostMouseEvent qui semble contourner ce problème, mais il a d'autres inconvénients (par exemple ne pas mettre en évidence les icônes sur le quai correctement. quand déplacer le pointeur sur le dessus de celui-ci, au moins sur ma machine.

Mise à jour

Je pense que je l'ai. pour laisser Finder Cange votre menu application barre, vous devez fournir aussi le MouseEventNu mber Integerfield, par ex. par

if (type == kCGEventLeftMouseDown) { 
    eventNumber++; 
    CGEventSetIntegerValueField (event, kCGMouseEventNumber, eventNumber); 
} 
if (type == kCGEventLeftMouseUp) { 
    CGEventSetIntegerValueField (event, kCGMouseEventNumber, eventNumber); 
} 
+0

Merci. Cela fonctionne sauf pour la première fois que vous essayez de changer l'application active. Aucune suggestion? – Rok

+0

peut-être en commençant par un EventNumber de 1? – nob

+0

Non, ne fonctionne toujours pas. – Rok

1

J'essaye eventNumber = 16384 et cela fonctionne! Mais je ne comprends tout simplement pas ce que cela signifie.