gpt4 book ai didi

swift - 如何使用 Swift 和 Cocoa 获取当前事件窗口

转载 作者:行者123 更新时间:2023-12-05 03:45:16 25 4
gpt4 key购买 nike

我目前正在开发一个 Safari 应用程序扩展,它由两部分组成:

  • 一个只有主机状态栏的应用程序
  • Safari 扩展

此外,主机应用程序还提供了一个全局快捷方式,可以在状态栏中打开一个弹出窗口。但是,我想检查哪个应用程序的窗口当前处于事件状态,因为如果 Safari 窗口当前处于事件状态,我不想打开弹出窗口。有什么方法可以使用 Swift 找出哪个应用程序的窗口当前处于事件状态?

感谢您的帮助。

最佳答案

因此,根据 Alexander 和 Wileke 的评论,我认为我找到了解决方案。

使用 NSWorkspace.shared.frontmostApplication 您可以检查 Safari 当前是否处于事件状态。但正如 Wileke 指出的那样,这并不意味着它有一个事件窗口。因此,我们使用 CGWindowListCopyWindowInfo 首先获取所有窗口,并通过比较 PID 来检查是否至少有一个窗口属于 Safari。

这样,我们可以有把握地说 Safari 当前必须有一个事件窗口来接收按键事件。这一定是真的,因为现在 Safari 在没有任何窗口的情况下位于最前面,或者 Safari 作为窗口但同时不在最前面。

好吧,除非我错过了什么。但目前它有效。

这是我想出的代码:

func safariIsActive() -> Bool {
// Get the app that currently has the focus.
let frontApp = NSWorkspace.shared.frontmostApplication!

// Check if the front most app is Safari
if frontApp.bundleIdentifier == "com.apple.Safari" {
// If it is Safari, it still does not mean, that is receiving key events
// (i.e., has a window at the front).
// But what we can safely say is, that if Safari is the front most app
// and it has at least one window, it has to be the window that
// crrently receives key events.
let safariPID = frontApp.processIdentifier

// With this procedure, we get all available windows.
let options = CGWindowListOption(arrayLiteral: CGWindowListOption.excludeDesktopElements, CGWindowListOption.optionOnScreenOnly)
let windowListInfo = CGWindowListCopyWindowInfo(options, CGWindowID(0))
let windowInfoList = windowListInfo as NSArray? as? [[String: AnyObject]]

// Now that we have all available windows, we are going to check if at least one of them
// is owned by Safari.
for info in windowInfoList! {
let windowPID = info["kCGWindowOwnerPID"] as! UInt32
if windowPID == safariPID {
return true
}
}
}
return false
}

关于swift - 如何使用 Swift 和 Cocoa 获取当前事件窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65890988/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com