【发布时间】:2014-06-17 00:04:21
【问题描述】:
我正在创建一个 OS X 应用程序,它将作为其他一些应用程序的伴侣。它将自己与最顶部的应用程序的一侧对齐,例如侧边栏。目前,我只是定期获取打开窗口的列表并将我的应用程序与最顶部的应用程序对齐。我正在使用 NSTimer:
[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(findHostWindow) userInfo:nil repeats:YES];
在 findHostWindow 中,我得到一个窗口列表:
CFArrayRef windowDefs =
CGWindowListCopyWindowInfo(kCGWindowListOptionOnScreenOnly | kCGWindowListExcludeDesktopElements, kCGNullWindowID);
我搜索 windowDefs 以找到我理想的宿主窗口。这很复杂,有点无关紧要。然后我找到了宿主窗口的边界:
CFDictionaryRef bounds = (CFDictionaryRef)CFDictionaryGetValue(idealHostWindowDef, kCGWindowBounds);
然后我执行 snap/dock 逻辑来模拟侧边栏。
我有两个担心:
- 轮询在性能方面效率不高
- 代码很丑
- 当我的窗口响应来自主机窗口的移动/调整大小时,存在明显的延迟
这样的事情有更好的方法吗?也许是在任何窗口移动/调整大小时提醒应用程序的系统事件?
在重绘窗口之前,我可以覆盖 NSWindow 中的一些更新方法来执行此操作,而不是基于间隔的方法?
编辑:据我所知,Accessibility API 可能会为此提供支持,但它不是实时的。它仅在用户完成移动/调整窗口大小后报告。
【问题讨论】:
标签: cocoa