繁体   English   中英

如何使用 Swift 和 Cocoa 获取当前活动的 window

How to get current active window using Swift and Cocoa

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

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

  • 仅主机状态栏应用程序
  • Safari 扩展

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

谢谢您的帮助。

1 个回复

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

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

这样,我们可以肯定地说 Safari 当前必须有一个活动的 window 接收关键事件。 This must be true as there is now way that Safari is front most without any windows or that Safari as an window but is not front most at the same time.

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

这是我想出的代码:

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
    }
1 使用Cocoa获取当前播放的歌曲

有没有办法(当然有一种方法,但是哪种方式)以编程方式获取有关当前在Mac(OS 10.5.8和OS 10.6)上在iTunes中播放的歌曲的信息? 我需要这个用于我的Cocoa应用程序。 我使用iTunes 8和Objective-C。 ...

2 使用窗口句柄获取当前活动窗口的路径

我想知道如何使用C#获取当前活动窗口的路径。 我得到currnet活动窗口的句柄 现在我如何获得该窗口的路径? 即:“我的文档”窗口的路径为 -=-=-==-=-=编辑-=-=-=-=-=- 我想编写监视“ Windows资源管理器”的程序,并查看用户的位置? ...

2012-07-14 14:27:23 2 3059   c#/ winapi
3 如何使用Storyboards / Cocoa在Swift 3.x中引用视图的窗口

借助Xcode和Swift的所有更改,我无法弄清楚如何以在stotyboard驱动的项目中解决视图窗口的方式,就像我在使用XIB的项目中所做的那样。 macOS编程的新手,如果这是基本内容,请提前道歉: 使用情节提要时,如何使用例如更改视图的窗口状态: 在xib驱动的项目中,我正 ...

8 获取当前活动窗口的线程ID

我需要获取活动窗口的线程ID。 是否有Windows API函数可以让我获取此信息? 有GetCurrentThreadId函数,但是它返回调用线程的ID,而不是活动窗口线程的ID,因此对于此目的没有用。 编辑: 如建议编辑我的问题以提供有关为什么我需要它的更多信息,这里是: ...

9 获取当前活动窗口的文件名

我正在尝试打开“另存为”或“打开”或“打印”等对话框时,要获取Word文档或其他任何窗口的文件名。 谁能给我一个如何在C#中实现此示例。 ...

10 多窗口活动获取当前屏幕宽度

在我的应用中,我根据当前的屏幕宽度制作了很多UI。 我有一个完美的辅助方法: 但是,当我为多窗口调整活动大小时,该函数返回手机屏幕宽度,而不是当前宽度。 大部分UI中断。 我需要一种在活动的onCreate()中计算宽度的机制(OnGlobalLayoutListener将无济 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM