如何在 Mac OS X 中监听应用程序启动事件?

2023-12-02

我写了一个AppleScript安装一个SparseBundle图像,我希望它准确地执行Time Machine发射。

现在,我定期检查 Time Machine 是否正在运行AppleScript using on idle陈述:

on idle
    ....
    return <interval>
end idle

这不是一个可靠的方法。在我看来,添加一个事件触发器Application Launch事件将是一个更好的方法。

能否请你帮忙?

An Objective-C or Python示例代码(我更喜欢Python)非常受欢迎。


您正在寻找的是,NS分布式通知中心 or NS工作空间,这些可可类发布应用程序事件的通知,对于工作区,诸如应用程序启动、驱动器安装等。

要在 python 中执行此操作,您需要PyObjC,它基本上是苹果 cocoa 类的 python 绑定。他们网站上的文档很少,这是有原因的,因为文档基本上与 Apple 文档相同,所以它们只包含 pyobjc api 和 cocoa API 之间的差异。如果您了解目标 c api 是如何转换为 python 的,那么您就可以开始了。检查这里:http://pyobjc.sourceforge.net/documentation/pyobjc-core/intro.html

我在下面提供了一个使用 python 监听分布式通知的示例。下面的代码基本上添加了一个观察者并监听 itunes 通知。您可以遵循类似的结构,但为 NSWorkspace 添加一个观察者。为了弄清楚您应该听什么,有一个应用程序可以显示通过您系统的所有通知。它被称为通知观察者。用它来确定你应该听什么。您还可以将 Objective C 代码转换为 Python。

下面的代码是做什么的

  1. 定义一个继承自 NSObject 的新类,由 PyObjC 定义
  2. 定义一个方法,该方法获取实际通知并将其打印出来
  3. 创建 Foundation.NSDistributedNotificationCenter.defaultCenter 的实例
  4. 创建 GetSongs 的实例
  5. 注册一个观察者,向其传递类、收到通知时调用的方法以及要监视的应用程序和事件,即“com.apple.iTunes.playerInfo”
  6. 运行事件循环,

有一件事会让你感到困惑,访问属性(目标 c 属性)与访问 python 属性的工作方式不同。即在Python中你做的class_name.att对于Python中的目标c,你必须像函数一样调用它,即从我下面的示例中:song.userInfo()

import Foundation
from AppKit import *
from PyObjCTools import AppHelper

class GetSongs(NSObject):
    def getMySongs_(self, song):
        print "song:", song
        song_details = {}
        ui = song.userInfo()
        print 'ui:', ui
        for x in ui:
            song_details[x] = ui.objectForKey_(x)
        print song_details

nc = Foundation.NSDistributedNotificationCenter.defaultCenter()
GetSongs = GetSongs.new()
nc.addObserver_selector_name_object_(GetSongs, 'getMySongs:', 'com.apple.iTunes.playerInfo',None)

NSLog("Listening for new tunes....")
AppHelper.runConsoleEventLoop()

这是实际输出的示例...(是的布兰妮摇滚!,不是!;)

song NSConcreteNotification 0x104c0a3b0 {name = com.apple.iTunes.playerInfo; object = com.apple.iTunes.player; userInfo = {
    Album = Circus;
    "Album Rating" = 0;
    "Album Rating Computed" = 1;
    Artist = "Britney Spears";
    "Artwork Count" = 1;
    Genre = Pop;
    "Library PersistentID" = 8361352612761174229;
    Location = "file://localhost/Users/izze/Music/iTunes/iTunes%20Music/Britney%20Spears/Circus/02%20Circus.mp3";
    Name = Circus;
    PersistentID = 4028778662306031905;
    "Play Count" = 0;
    "Play Date" = "2010-06-26 08:20:57 +0200";
    "Player State" = Playing;
    "Playlist PersistentID" = 7784218291109903761;
    "Rating Computed" = 1;
    "Skip Count" = 1;
    "Skip Date" = "2010-06-26 12:20:57 +0200";
    "Store URL" = "itms://itunes.com/link?n=Circus&an=Britney%20Spears&pn=Circus";
    "Total Time" = 192444;
    "Track Count" = 16;
    "Track Number" = 2;
}}
ui {
    Album = Circus;
    "Album Rating" = 0;
    "Album Rating Computed" = 1;
    Artist = "Britney Spears";
    "Artwork Count" = 1;
    Genre = Pop;
    "Library PersistentID" = 8361352612761174229;
    Location = "file://localhost/Users/izze/Music/iTunes/iTunes%20Music/Britney%20Spears/Circus/02%20Circus.mp3";
    Name = Circus;
    PersistentID = 4028778662306031905;
    "Play Count" = 0;
    "Play Date" = "2010-06-26 08:20:57 +0200";
    "Player State" = Playing;
    "Playlist PersistentID" = 7784218291109903761;
    "Rating Computed" = 1;
    "Skip Count" = 1;
    "Skip Date" = "2010-06-26 12:20:57 +0200";
    "Store URL" = "itms://itunes.com/link?n=Circus&an=Britney%20Spears&pn=Circus";
    "Total Time" = 192444;
    "Track Count" = 16;
    "Track Number" = 2;
}
{u'Album Rating Computed': 1, u'Album': u'Circus', u'Rating Computed': True, u'Name': u'Circus', u'Artist': u'Britney Spears', u'Track Number': 2, u'Skip Date': 2010-06-26 12:20:57 +0200, u'Library PersistentID': 8361352612761174229L, u'Player State': u'Playing', u'Total Time': 192444L, u'Genre': u'Pop', u'Playlist PersistentID': 7784218291109903761L, u'Album Rating': 0, u'Location': u'file://localhost/Users/izze/Music/iTunes/iTunes%20Music/Britney%20Spears/Circus/02%20Circus.mp3', u'Skip Count': 1, u'Track Count': 16L, u'Artwork Count': 1, u'Play Date': 2010-06-26 08:20:57 +0200, u'PersistentID': 4028778662306031905L, u'Play Count': 0, u'Store URL': u'itms://itunes.com/link?n=Circus&an=Britney%20Spears&pn=Circus'}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Mac OS X 中监听应用程序启动事件? 的相关文章

  • 如何捕获 Scrollview 内的缩放 UIImageView 进行裁剪?

    问题 缩小图像进行裁剪就可以了 放大图像后进行裁剪会显示应有的图像上方的图像 我在那里的 yOffset 是因为我想要的裁剪方块从滚动视图的下方开始 Code CGRect rect float yOffset 84 rect origin
  • -bash: gulp: 在 Mac 中找不到命令

    我尝试在 mac 中安装 gulp 如下所示 Is iMac itop npm root Users itop node modules Is iMac itop npm config set prefix usr local Is iMa
  • UITableView 顶部出现间隙[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我不确定现在问这个问题是否合适 我正在表视图上使用 Xcode 5 预览版 现在的问题是我的表格视图是否被选择为group比我在第一个单元
  • 为什么 UIScrollView 在顶部留有空间并且不滚动到底部

    我是 Objective C 编程新手 我正在使用 UIScrollView 及其上的一些标签 图像和文本视图 我已关闭自动布局 并已尝试打开 调整滚动视图插图 标题中描述的情况 和关闭 不滚动 这是我插入 viewDidLoad 的内容
  • 我可以通过编程方式获取连接到手机的 wifi 的 MAC 地址吗?

    我的手机已连接到 wifi 我想获取我的 wifi 的 MAC 地址 BSSID 和 mac 地址是同一回事 您可以通过此函数获取 mac 地址 只需导入 SystemConfiguration CaptiveNetwork func ge
  • valgrind 和 iOS SDK 4.2?

    使用 valgrind 运行 iOS 4 2 应用程序时遇到问题 我从 Macports 安装了 valgrind 3 6 0 SVN Xcode 3 2 5 当我修改 main 以运行 valgrind 时 我得到以下输出 Detecte
  • 如何在自定义按钮单击时通过@selector传递数据?

    我正在通过代码制作一个按钮 我有以下代码行来在单击按钮时触发方法 imagesButton addTarget self action selector photoClicked forControlEvents UIControlEven
  • 在 Objective-C 中做事的正确位置

    我开始尝试使用 ObjectiveFlickr 框架 目标是创建一个相对简单的 iPhone 地图应用程序 显示当前 MKMapView 区域内带地理标记的 flickr 内容 我遇到了与线程相关的问题before https stacko
  • 具有多个嵌入 Segue 的 ContainerView

    有没有办法让单个 ContainerView 具有多个嵌入序列 目的是让 ContainerView 根据按下的按钮来容纳一些不同的 ViewController 一次只能看到一个 我想使用嵌入序列 以便在 Interface Builde
  • 我可以在 iOS 中测量蓝牙信号强度吗?

    Can I 测量信号强度我的 iPhone 范围内的蓝牙设备数量 基本上我想要做的是扫描范围内的设备列表 然后查看哪个设备的信号强度最高 在 iOS 中是否可行 如果可以 我该怎么做 是的 有一种方法可以测量蓝牙低功耗 4 0 的信号强度
  • 电子邮件在 ShareKit 中不起作用并且没有错误

    我正在使用 ShareKit 将 Facebook Twitter 和电子邮件共享添加到我的 iPhone 应用程序中 现在 Facebook 和 Twitter 可以使用 但电子邮件无法使用 最大的问题是没有错误或任何错误 它正常工作 但
  • 在 macOS 上更新 GNU make

    我从下载了 GNU make 4 2 1here http ftp gnu org gnu make make 4 2 1 tar gz 并按照展开文件夹中的 INSTALL 文件中的说明安装它 现在我跑make v在 shell 中 我仍
  • 在 SwiftUI TextEditor 中设置光标位置

    有没有办法以编程方式将光标移动到特定文本行或在 SwifUI 中选择它TextEditor 例如 如果有一个TextEditor里面写着10行 当用户按下按钮时 光标将导航到第三行 或者文本将被选择 目前使用默认的 SwiftUI 是不可能
  • 如何在 iOS 中按下后退按钮时创建确认弹出窗口?

    我想在有人按下 iOS 应用程序的 后退 按钮时添加一个弹出窗口 询问用户是否真的想回来 然后 根据用户的响应 我想撤消该操作或继续 我尝试在视图的 viewWillDisappear 函数中添加代码 然后编写正确的委托 但它不起作用 因为
  • 在 Intel 机器上构建 Apple Silicon 二进制文件

    如何在 macOS 11 Intel 上编译 C 项目以在 Silicon 上运行 我当前的构建脚本很简单 configure make sudo make install 我尝试过使用 host and target标志与aarch64
  • iOS:在代码中访问 app-info.plist 变量

    我正在开发通用应用程序 并且希望访问代码中 app info plist 文件中存储的值 原因 我使用以下方法从故事板动态实例化 UIViewController UIStoryboard storyboard UIStoryboard s
  • 存储和检索多维 NSMutableArray 的最佳方法是什么?

    我将一堆数据存储在 plist 文件 在应用程序文档文件夹中 中 其结构如下 Dictionary description String Value sections Array Array Number Number Array Numb
  • UIKIT_EXTERN_CLASS 和 UIKIT_EXTERN,这两个常量是什么?

    当我在文档中定义类时 我总是在 interface 之前看到这两件事 UIKIT EXTERN CLASS 和 UIKIT EXTERN 这些常量代表什么以及为什么 Apple 将其放在类之前 另一件事是 有文件 UIKitDefines
  • 10.11 NSCollectionView - 动态确定单元格大小

    OS X v10 11 AppKit 发行说明 https developer apple com library mac releasenotes AppKit RN AppKit 10 11CollectionView建议可以根据每个项
  • 在 UITableView 中创建隐藏的 UISegmentedControl

    与 iBooks 应用程序一样 当您下拉表格视图时 会出现搜索栏和分段控件 以允许您在两种类型的视图之间搜索和切换 当您向下拉得足够远时 它会停留在该位置 或者当您将桌面视图拉得足够远时 它会被隐藏 我正在尝试用一个来实现同样的事情UISe

随机推荐

  • Perl:V 5.8.8:在 CentOS5/RHEL5 上找不到 auto/XML/LibXSLT/new.al

    我正进入 状态 无法找到 auto XML LibXSLT new al 我的 CentOS5 机器上安装 Perl 5 8 8 时出错 此问题与 libxml2 和 perl 模块有关XML LibXML XML LibXSLT 对于 1
  • 为什么在函数调用中捕获对象的值?

    当您单击此代码时 应该会弹出一个带有图像编号的警报 for var i 0 i lt 10 i img i click function alert i 你可以看到它不起作用http jsfiddle net upFaJ 我知道这是因为所有
  • DIV 未显示在 Chrome 中

    我刚刚做了一个非常简单的网站 但遇到了问题 在 Firefox 和 Safari 中 我可以看到 id 为 sponsors 的 DIV 但在 Chrome 中它消失了 我在Mac上 有人有解决办法吗 http www tweetup vn
  • 异常:[!]您的应用程序正在使用不受支持的 Gradle 项目

    我正在尝试运行现有的 flutter 应用程序 但收到此异常 我该如何解决这个问题 例外 您的应用程序正在使用不受支持的 Gradle 项目 要解决此问题 请通过运行创建一个新项目flutter create t app
  • HTTP 到 HTTPS 重定向不适用于现有规则

    我已经做了三天了 没有任何结果 我有一个现有的 http 网站 它有很多重定向规则 具体取决于 URL 友好链接 我现在需要强制加载到 https Google 最终会将它们从索引中删除 但有很多指向我的第三方网站页面的链接无法物理改变 下
  • 在 Haskell 中生成斐波那契数?

    在Haskell中 如何根据第n个斐波那契数等于第 n 2 个斐波那契数加上第 n 1 个斐波那契数的性质生成斐波那契数 我见过这个 fibs Integer fibs 1 1 zipWith fibs tail fibs 我不太明白这一点
  • 如何在 R 中提取 1x1 数组切片作为矩阵?

    我正在使用 3D 阵列 函数从用户处获取 2D 数组切片 矩阵 并使用行和列名称 数组的相应暗名称 将其可视化 如果数组维度 gt 1 它就可以正常工作 但是 如果我有 1x1x1 数组 我无法将切片提取为矩阵 a lt array 1 c
  • 左操作数为负数时未定义的行为

    几天前 我在那里参加了微软 GD 实习在线考试 我一直在研究负数左移是一种未定义的行为 但该论文的 30 个问题中几乎有 7 个问题与移位运算符相关 其中大约 5 个问题涉及将负数向左移动 而且他们没有选择说 未定义 行为 看到这一幕我很震
  • 使用 Andengine 绘制圆

    我正在寻找一种使用 Andengine 画圆的方法 正如我所看到的 我只能绘制线条 矩形和放置精灵 但我找不到绘制圆形的方法 我怎样才能做到这一点 事实上 你不能直接画一个圆 替代方案是 渲染具有圆形纹理的四边形 请参见这个链接 例如 渲染
  • 升级后文件丢失

    我安装的是1 1版本 我使用 1 2 版本创建了升级 在这两种产品中我都有 2 个文件
  • 如何拦截提交按钮的点击?

    我有一个表单和一个提交按钮 我想快速检查一些字段 如果未填写某个字段 则空白其他一些字段 我不想更改按钮的 HTML 我只想在 jQuery 中执行此操作 而不向按钮添加任何 onclick 属性 HTML
  • 无效的密钥哈希 facebook android sdk

    我正在尝试使用 Facebook Android SDK 开发一个带有 Facebook 登录按钮的简单应用程序 但我在密钥哈希方面遇到了麻烦 我已经创建了调试密钥和发布密钥 在 mac 中 调试键 keytool exportcert a
  • 给字符串添加空格

    我正在尝试为每个空格添加一个空格 直到column 0 我不知道该怎么做 问题如下 如果你看报纸 你会发现文章的内容很适合专栏 写一个程序 它读取报纸中栏的宽度 然后读取一行文本 对齐文本行以适应 该宽度的列 当你的程序运行时 屏幕应该看起
  • PHP 卷曲,保留会话

    我正在制作一个应用程序 可以从网站上抓取数据 根据需要对其进行格式化 然后将其显示给用户 现在 该站点不允许跨站点脚本请求 因此我使用 PHP 的curl 来检索页面 使用浏览器时 网站会在您首次访问时向您提供 cookie 要求您登录 并
  • 使用 Flexbox 居中时 Safari 不显示 SVG

    我在 Safari SVG 和 Flexbox 方面遇到问题 目标是拥有一个响应式 SVG 保持宽高比 16 9 此外 SVG 应始终位于屏幕的垂直和水平中心 以下代码适用于除 Safari 之外的所有浏览器 我尝试了不同的供应商前缀 但我
  • 核心数据 keyPathsForValuesAffectingValueForKey 仅调用关系,而不调用属性

    我正在使用核心数据来建模一个具有属性和关系的实体 我想让其中一个属性依赖于另外两个关系 核心数据常见问题解答和其他几个示例使用 NSSet keyPathsForValuesAffectingValueForKey NSString key
  • 取消用户定义函数中先前的操作

    是否可以取消用户定义函数中之前的操作 例如 CREATE OR REPLACE FUNCTION transact test RETURNS BOOLEAN AS BEGIN UPDATE table1 SET UPDATE table2
  • 如何从android中的sqlite数据库中检索数据并将其显示在TextView中

    我正在学习安卓 我有一个问题 但我无法解决它 我想从现有数据库中检索数据并将其显示在TextView单击按钮后 My code 数据库助手看起来像这样 public class DataBaseHelper extends SQLiteOp
  • 卷积中的2D步幅是什么意思?

    我知道当步幅只是一个整数时它的含义是什么 通过这一步你应该对图像应用过滤器 但是关于 1 1 或者甚至更多维度的进步 The stride定义滤波器如何沿着输入图像 张量 移动 没有什么可以阻止你沿着不同的轴以不同的方式大步前进 例如 st
  • 如何在 Mac OS X 中监听应用程序启动事件?

    我写了一个AppleScript安装一个SparseBundle图像 我希望它准确地执行Time Machine发射 现在 我定期检查 Time Machine 是否正在运行AppleScript using on idle陈述 on id