如何跟踪属于另一个应用程序的 window 的位置
How to track the location of a window belonging to another app
当使用 Zoom 或 Skype/Teams 在 macOS 上共享特定 window 屏幕时,他们会在 window(属于不同的应用程序)周围绘制红色或绿色高亮边框,以表示正在共享。边框实时跟随目标window,调整大小、z 顺序变化等
参见示例:
可以使用哪些 macOS API 和技术来实现这种效果?
您可以使用 CGWindowListCopyWindowInfo
和相关的 API 找到 windows 的位置,沙盒应用程序可用。
这是一个非常快速和高效的 API,速度足以进行轮询。 SonOfGrab 示例代码是尝试这些内容的绝佳平台。
您还可以使用 +[NSEvent addGlobalMonitorForEventsMatchingMask:handler:]
(在沙盒中可用)安装全局事件点击以跟踪鼠标按下、拖动和鼠标弹起事件,然后您可以在用户开始或释放拖动时立即响应。这样你的反应会很快。
(绘制边框将通过创建您自己的透明 window 来完成,略大于您正在跟踪的 window 层,并且与您在同一 window 层。并且然后简单地在里面画一个漂亮的绿色框。我不太确定设置z顺序。这部分的细节最好作为一个单独的问题。)
当使用 Zoom 或 Skype/Teams 在 macOS 上共享特定 window 屏幕时,他们会在 window(属于不同的应用程序)周围绘制红色或绿色高亮边框,以表示正在共享。边框实时跟随目标window,调整大小、z 顺序变化等
参见示例:
可以使用哪些 macOS API 和技术来实现这种效果?
您可以使用 CGWindowListCopyWindowInfo
和相关的 API 找到 windows 的位置,沙盒应用程序可用。
这是一个非常快速和高效的 API,速度足以进行轮询。 SonOfGrab 示例代码是尝试这些内容的绝佳平台。
您还可以使用 +[NSEvent addGlobalMonitorForEventsMatchingMask:handler:]
(在沙盒中可用)安装全局事件点击以跟踪鼠标按下、拖动和鼠标弹起事件,然后您可以在用户开始或释放拖动时立即响应。这样你的反应会很快。
(绘制边框将通过创建您自己的透明 window 来完成,略大于您正在跟踪的 window 层,并且与您在同一 window 层。并且然后简单地在里面画一个漂亮的绿色框。我不太确定设置z顺序。这部分的细节最好作为一个单独的问题。)