繁体   English   中英

如何使用 Swift 和 Cocoa 获取当前活动窗口

How to get current active window using Swift and Cocoa

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

我目前正在开发一个 Safari App Extension,它由两部分组成:

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

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

谢谢你的帮助。

1 个回复

因此,根据 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
    }
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