Синтетический щелчок не переключает панель меню приложения (Mac OS X) - PullRequest
2 голосов
/ 08 апреля 2010

Я разрабатываю какое-то приложение для мыши на платформе iPhone. Это приложение подключается к одному компьютерному сервису, который генерирует события мыши в Mac OS X. Я генерирую эти события с помощью CGEventCreateMouseEvent () и CGEventPost (). Но я столкнулся с одной проблемой. Допустим, вы используете Safari, а затем нажимаете на свободное место на рабочем столе. Если вы сделаете это с помощью обычной мыши, она скроет верхнюю строку меню Safari и покажет строку меню Finder. Но на этих синтетических событиях это не действует так. Нужно ли публиковать какие-либо другие события или устанавливать дополнительные свойства?

Вот мой код для мышки вверх, мышка вниз:

- (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);
}

Ответы [ 2 ]

2 голосов
/ 10 мая 2010

Вы можете попробовать CGPostMouseEvent, который, кажется, обходит эту проблему, но имеет другие недостатки (например, неправильно подсвечивает значки на док-станции при перемещении указателя поверх него, по крайней мере, на моем компьютере.

Обновление

Я думаю, у меня это есть. Чтобы позволить Finder изменять строку меню приложения, вы должны также предоставить целое поле MouseEventNumber, например, от

if (type == kCGEventLeftMouseDown) {
   eventNumber++;
   CGEventSetIntegerValueField (event, kCGMouseEventNumber, eventNumber);
}
if (type == kCGEventLeftMouseUp) {
   CGEventSetIntegerValueField (event, kCGMouseEventNumber, eventNumber);
}
1 голос
/ 21 мая 2010

Я пробую eventNumber = 16384, и это работает! Но я просто не понимаю, что это значит.

...