OSX - 如何在包括全屏在内的所有空间中识别光标下的窗口

时间:2014-12-17 06:02:07

标签: cocoa fullscreen nswindow

我正在使用Window Services' CGWindowListCreateCGWindowListCreateDescriptionFromArray获取窗口信息。在常规空间中获取kCGWindowBounds时,一切正常(我在第0层的最前面的窗口周围绘制边框)。但是,当我在全屏应用程序的空间中使用相同的方法时,我得到了无意义的界限:(0,855,480,1)。

如果有一种简单的方法可以判断我目前是否在全屏应用的空间,我不会太在意这件事,因为那时我只是画一个边框屏幕(好吧......如果菜单栏显示的话,依赖...)。

这是一个错误,还是有这种行为的原因?

修改 找出我的问题。这是一个比我想要的更大的问题。事情是API通过所有NSWindows,甚至那些不是,正常的窗户。例如,Chrome底部的Chrome加载栏本身就是一个窗口,Mail也在应用程序的顶部有一些窗口。这是一个问题,因为我无法区分看起来最前面的窗口。

对于我的应用程序,我想捕获一个特定窗口来拦截其中的鼠标事件。我本来希望能够让用户按下热键,然后单击所需的窗口进行选择,但没有API来获取光标下的窗口。我不知道如何继续。

编辑2: 为了更好地帮助人们找到有用的答案,更改了标题:" Quartz Window Services为全屏应用返回错误的窗口界限"

2 个答案:

答案 0 :(得分:0)

您是否为窗口委托定义了这些方法?

- (NSSize)window:(NSWindow *)window willUseFullScreenContentSize:(NSSize)proposedSize
{
    NSRect mainDisplayRect = [[NSScreen mainScreen] frame];
    CGSize cgScreenSize = CGSizeMake(mainDisplayRect.size.width, mainDisplayRect.size.height);

    return cgScreenSize;
}

- (void)windowWillEnterFullScreen:(NSNotification *)notification
{

}

- (void)windowDidEnterFullScreen:(NSNotification *)notification
{

}

- (void)windowWillExitFullScreen:(NSNotification *)notification
{

}

答案 1 :(得分:0)

我继续浏览描述词典并检查当前光标位置是否在窗口范围内。满足这个要求的第一个窗口就是光标下面的窗口,这正是我需要的。

另外,为了找到当前最顶层的窗口,我使用了Accessibility API的iChat Apple示例来注册ApplicationActivatedNotificationMainWindowDidChangeNotification。两个通知组合将让我跟踪活动应用程序的主窗口(最顶层)。为了获得这种情况的界限,我只使用辅助功能API获得了主窗口的位置和大小。