gpt4 book ai didi

C# + iTunes COM : iTunes event sometimes gets raised, 通常不会

转载 作者:可可西里 更新时间:2023-11-01 10:09:33 28 4
gpt4 key购买 nike

我正在制作一个实用程序,允许我使用热键控制 iTunes(通过 COM 库)。热键有效,iTunes 的控制,如下一首和上一首轨道都有效。

此实用程序的另一部分是显示歌曲更改时的通知。通过一些阅读和实验,我发现 iTunesAppClass 上的正确事件是OnPlayerPlayEvent ,所以当我将它连接到托盘通知时,它的效果绝对完美。

我遇到的问题是,在我运行程序的绝大部分时间里,似乎根本没有引发该事件。但是,我的代码没有任何更改的情况很少会引发事件并显示我的工具提示。

这就是我设置 iTunes 对象的方式:

itunes = new iTunesAppClass();  
itunes.OnPlayerPlayEvent += new _IiTunesEvents_OnPlayerPlayEventEventHandler(itunes_OnPlayerPlayEvent);

这是事件处理程序:

private void itunes_OnPlayerPlayEvent(object iTrack)
{
IITTrack track = iTrack as IITTrack;
CurrentTrack = track;

// ... notification.
}

有什么想法吗?

编辑: 在尝试了更多之后,似乎当一个新的 iTunes 实例打开并且我的应用程序第一次连接到该实例时,事件就会触发。也就是说,如果 iTunes 和我的实用程序(带有工作通知)都打开了,我应该关闭并重新打开我的实用程序,它的通知将不起作用。但是,如果我关闭并重新打开 iTunes,那么我的实用程序、通知将起作用。

这似乎是问题所在,因为如果我关闭我的实用程序,然后尝试关闭 iTunes,iTunes 会告诉我脚本接口(interface)仍在被应用程序使用(即使它不是)。

因此,似乎 iTunes 只会为第一个注册的应用程序触发事件,或者 iTunes 试图为一个不存在的应用程序触发事件,失败,并在为其他应用程序触发事件之前停止。

所以我应该问的是,有没有办法在退出时取消我的应用程序在 iTunes 中的注册?或者甚至取消注册除我的以外的所有已注册应用程序?

最佳答案

@OG- 我确实找到了解决问题的办法:

public void Destroy()
{
// Remove any handlers from the iTunes COM object.
itunes.OnPlayerPlayEvent -= itunes_OnPlayerPlayEvent;

// Release the COM object.
Marshal.ReleaseComObject(itunes);
}

我在窗体的 FormClosing 事件上调用了 Destroy 方法,这样它就会在我每次关闭应用程序时释放。将此代码转换为 VB.NET 应该很简单。

关于C# + iTunes COM : iTunes event sometimes gets raised, 通常不会,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3368177/

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