【问题标题】:Change iTunes click to enqueue instead of play更改 iTunes 单击以排队而不是播放
【发布时间】:2011-10-23 05:08:52
【问题描述】:

当您单击歌曲或专辑时,我正在尝试更改 iTunes 的工作方式。我想拦截点击,而不是播放该项目,我希望将该项目添加到某个播放列表中。 我试图通过从NSDistributedNotificationCenter 捕获单击事件来拦截单击事件,阻止它传播并执行将添加到播放列表的 Apple 脚本。 问题是我无法拦截 iTunes 鼠标点击。你能帮我解决这个问题吗?

非常感谢。

【问题讨论】:

    标签: objective-c cocoa itunes


    【解决方案1】:

    我认为解决此问题的最佳方法是创建一个 SIMBL 插件,它可以让您访问 iTunes(应用程序本身),然后您应该能够从那里进行调配播放按钮触发到您自己的方法的操作,该方法执行您想要的操作。

    我从您的问题中猜测,在您的方法中,您将执行 Apple 脚本以将所选项目添加到播放列表中。以下是有关使用 AppleScript 执行此操作的更多信息:herehere

    有关 SIMBL check out the website 的更多信息,如果您不确定从哪里开始,请查看 this tutorial 构建 SIMBL 插件。

    【讨论】:

    • 我看了一下 SIMBL,我认为用“方法调配”技术代替 iTunes 中的“播放”功能是最好的选择。不过,仍在为此苦苦挣扎。 :)
    • 是的,这当然不容易。最难的部分是找出播放按钮调用的动作。有一个名为class-dump 的工具可以帮助您解决这个问题。查找有关它的更多信息here
    • 非常感谢!我已经在阅读 SIMBL 教程并设法创建了一个 iTunes.h,其中包含 iTunes 使用的所有 Cocoa 功能。我现在正在与 Method Swizzling 作斗争,我似乎无法让它发挥作用。
    • 太棒了!对于方法调配,我使用这个类here,该页面上有一些关于如何使用它的信息。一个例子是:[iTunes jr_swizzle:@selector(play:) withMethod:@selector(my_play:) error:&error]; 这样当 iTunes 调用 play: 时,它会触发你的方法 my_play:
    • 这正是我现在正在尝试的。我让 Xcode 来编译该死的包,但是我找不到它。
    【解决方案2】:

    我找到了另一种方法来做到这一点,即使用NSDistributedNotificationCenter 而不是拦截点击。当播放器状态发生变化时,iTunes 会发布一个分布式通知,这包括按下播放按钮。

    您可以订阅这个名为 com.apple.iTunes.playerInfo 的通知,当您收到它时,您可以查看播放器状态是否为正在播放,如果是,您知道按钮已被按下,您可以从这里运行一些 AppleScript 来暂停/停止音乐播放并做你想做的事(例如将所选歌曲添加到播放列表)。

    通知还提供了许多其他信息,您可以在此处查看所有这些信息:

    要订阅通知,只需执行以下操作并实现iTunesPlayerStateChanged: 方法。

    [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(iTunesPlayerStateChanged:) name:@"com.apple.iTunes.playerInfo" object:nil];
    

    【讨论】:

      【解决方案3】:

      一种方法是使用辅助功能 API 跟踪 iTunes 窗口/播放按钮的位置,然后安装活动的 CGEventTap 以拦截鼠标点击。如果点击落在 iTunes 按钮上,那么您可以阻止事件传播到 iTunes(通过从事件点击回调中返回 NULL)并自行处理。

      与 SIMBL 方法相比,它的主要优点是它不依赖于 iTunes 中的内部实现,因此即使 iTunes 更新并更改其内部方法/功能,它也应该继续工作。

      【讨论】:

      • 不错的答案。我曾考虑将辅助功能 API 与 NSEventaddGlobalMonitorForEventsMatchingMask:handler: 结合使用来检测鼠标按下,然后检查它是否指向播放按钮,但我知道没有办法阻止它到达 iTunes,但我现在看到了CGEventTap 可以解决这个问题。 +1!
      • 这是否允许我拦截在个别歌曲中的点击或仅在播放/暂停按钮上进行的点击?谢谢您的回答! :)
      猜你喜欢
      • 2022-08-18
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      • 2019-02-19
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多