【问题标题】:OSX - How to identify window under cursor in all spaces including fullscreenOSX - 如何在包括全屏在内的所有空间中识别光标下的窗口
【发布时间】:2014-12-17 06:02:06
【问题描述】:

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

如果有一种简单的方法来判断我当前是否在全屏应用的空间中,我不会太在意这一点,因为那样我只需在屏幕周围画一个边框(嗯......它取决于菜单栏是否显示...)。

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

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

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

编辑 2: 为了更好地帮助人们找到有用的答案,将标题从:“Quartz Window Services 返回错误的全屏应用程序窗口边界”

【问题讨论】:

    标签: cocoa fullscreen nswindow


    【解决方案1】:

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

    - (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
    {
    
    }
    

    【讨论】:

    • 如果我不清楚,我很抱歉,但我对我以外的应用程序窗口感兴趣。
    • 我以前没有这样做过,但也许你应该要求窗口框架,而不是边界:NSRect windowRect = [aWindowID frame];
    【解决方案2】:

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

    另外,为了找到当前最顶层的窗口,我使用 iChat Apple 的 Accessibility API 示例注册ApplicationActivatedNotificationMainWindowDidChangeNotifications。两个通知结合起来可以让我跟踪活动应用程序的主窗口(最顶部)。为了在这种情况下获得边界,我刚刚使用 Accessibility API 获得了主窗口的位置和大小。

    【讨论】:

      猜你喜欢
      • 2016-02-24
      • 1970-01-01
      • 1970-01-01
      • 2018-11-16
      • 2011-09-23
      • 1970-01-01
      • 1970-01-01
      • 2012-02-19
      • 1970-01-01
      相关资源
      最近更新 更多