2013-08-03 54 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:。最后它将主窗口的ignoresMouseEvents属性更改为NO。

但是,即使日志确实在点击主菜单栏时显示'点击',点击仍不起作用。如果我点击一个菜单项(例如“文件”菜单项),它将不会打开相应的菜单(在这种情况下是文件菜单)。

我在做什么错?

回答

2

在应用程序甚至收到它之前,事件所针对的窗口由窗口服务器决定。在致电-sendEvent:时尚未确定。 -setIgnoresMouseEvents:的主要作用是通知窗口服务器,而不是Cocoa的内部,如何分派鼠标事件。

除了事件点击之类的事情之外,一旦您收到事件,重新定位事件为时已晚。

请注意,例如,在拨打-sendEvent:之前,NSEvent已经有关联的-window-sendEvent:正准备使用它来发送它。

如果您希望允许点击菜单栏,您应该调整窗口的大小,使其不会与菜单栏重叠,或者应将其窗口级别设置为位于菜单栏后面。

+0

非常感谢你肯,很好的回答! – Fatso