2013-08-03 6 views
0

У меня есть полноэкранное прозрачное окно, которое отображается над основным меню моего приложения. Он имеет ignoresMouseEvents, установленный в NO. Для того, чтобы получить щелчки мыши, тем не менее, я добавил этот код:-SendEvent не ведет себя так, как ожидалось

[NSEvent addLocalMonitorForEventsMatchingMask:NSLeftMouseDownMask handler:^(NSEvent *event) { 
    [self click:event]; 
    return event; 
}]; 

Каждый раз, когда пользователь щелкает в то время как мое приложение является активным, метод click, таким образом, называется:

- (BOOL)click:(NSEvent *)event { 
    NSPoint coordinate = [event locationInWindow]; 
    float ycoord = coordinate.y; 
    float menuheight = [[NSApp mainMenu] menuBarHeight]; 
    float windowheight = [[NSApp mainWindow] frame].size.height; 
    if (ycoord >= windowheight - menuheight && ![[NSApp mainWindow] ignoresMouseEvents]) { 
     [[NSApp mainWindow] setIgnoresMouseEvents:YES]; 
     [NSApp sendEvent:event]; 
     NSLog(@"click"); 
     [[NSApp mainWindow] setIgnoresMouseEvents:NO]; 
     return YES; 
    } 
    return NO; 
} 

Как вы можете видеть, он меняется ignoresMouseEvents свойство главного окна к YES, если щелчок находился в строке главного меню, после чего он вызывает sendEvent: в NSApplication. Наконец, он изменяет свойство ignoresMouseEvents главного окна обратно на NO.

Однако, несмотря на то, что журнал нажимает «щелкнуть», когда нажата кнопка главного меню, клик не действует. Если я нажму на элемент меню (например, пункт меню «Файл»), например, он не откроет соответствующее меню (в этом случае меню файла).

Что я делаю неправильно?

ответ

2

Окно, на которое нацелено событие, определяется сервером окон, прежде чем ваше приложение даже получит его. Во время звонка не принимается решение -sendEvent:. Основной эффект -setIgnoresMouseEvents: заключается в том, чтобы сообщить серверу окна, а не внутренним компонентам Cocoa, о том, как отправлять события мыши.

За исключением некоторых событий, когда вы получили событие, слишком поздно перенаправлять его.

Обратите внимание, например, что NSEvent уже связан с -window до вашего звонка до -sendEvent:. -sendEvent: просто собирается использовать это, чтобы отправить его.

Если вы хотите разрешить клики в строке меню, вы должны либо изменить размер окна, чтобы он не перекрывал строку меню, либо вы должны установить его уровень окна за панель меню.

+0

спасибо, Ken, отличный ответ! – Fatso