我正在创建一个 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);
然后我执行捕捉/停靠逻辑来模拟侧边栏。
我有两个担忧:
- 轮询在性能方面效率不高
- 代码很难看
- 当我的窗口响应主机窗口的移动/调整大小时,存在明显的延迟
对于这样的事情有更好的方法吗?也许是一个系统事件,当任何窗口移动/调整大小时提醒应用程序?
NSWindow 中是否有一些更新方法可以在重绘窗口之前重写以执行此操作,而不是基于间隔的方法?
编辑:据我所知,Accessibility API 可能会提供对此的支持,但它不是实时的。它仅在用户完成移动/调整窗口大小后报告。
最佳答案
我知道你能够通过 JavaScript 操作网页的前端。这包括实时操作。可能找到一种方法来添加触发时的事件。
抱歉无法提供更多帮助
关于cocoa - 检测另一个应用程序的窗口何时被移动/调整大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24253930/