我可以抑制此消息吗? >>一个或多个应用程序正在使用iTunes脚本界面

时间:2013-04-08 23:34:56

标签: c# windows api com itunes

我正在编写一个小型的C Sharp程序,使用iTunes Windows COM api与iTunes连接。我的程序必须在iTunes启动之前和iTunes关闭之后运行。我想让它检测iTunes何时使用OnQuittingEvent关闭。

    private void itunes_OnQuittingEvent()
    {
        // Remove any handlers from the iTunes COM object.
        app.OnPlayerPlayEvent -= itunes_OnPlayerPlayEvent;
        app.OnQuittingEvent -= itunes_OnQuittingEvent;
        bniTunesRunning = false;
        // Release the COM object.
        app = null;
        Console.WriteLine("iTunes Closing!");
    }

然而,当我的程序运行时,当我关闭iTunes时,我收到一条警告消息:“一个或多个应用程序正在使用iTunes脚本界面”,然后在iTunes关闭之前进行20秒倒计时。

我的问题: 我是否可以使用iTunes Windows COM OnQuittingEvent事件处理程序在关闭iTunes应用程序时在我的C代码中取消实例化iTunesApp对象引用,从而没有在屏幕上显示该警告消息?有没有办法完全压制这条警告信息?

此处提出了类似的问题:How to suppress "There are still active COM objects in this application" error when closing application?但代码是C ++而不是C Sharp。

谢谢。

2 个答案:

答案 0 :(得分:1)

要阻止对话框,您需要减少运行时可调用包装器引用计数,然后强制收集iTunesAppClass引用。有关详细信息,请参阅用户Bonj here发布的信息。与他们的示例不同,我发现在收集之前没有必要将iTunesAppClass引用设置为null。但是,可能取决于您的实施。我还发现我没有必要在循环中减少RCW,因为我只引用了一个COM对象。这是一个适用于我的应用程序的示例:

var app = new iTunesLib.iTunesAppClass();

// do stuff

System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
System.GC.Collect();

答案 1 :(得分:0)

由于我没有足够的声誉对Jason的答案发表评论,我将再发一篇文章。

我不知道为什么他的回答被拒绝了,但是效果很好。我知道这最初是C#,但我只知道VB(我确定你可以翻译)。

Public Sub iTunesApplication_Dispose()
    RemoveHandler iTunesApplication.OnPlayerPlayEvent, AddressOf Track_Played
    Runtime.InteropServices.Marshal.ReleaseComObject(iTunesApplication)
    iTunesApplication = Nothing
    System.GC.Collect()
End Sub

如果没有他建议的这两行,我仍然会收到一个应用程序连接到脚本界面的通知(尽管我处理甚至关闭了我的程序)。当然,我不应该只是为了断开连接来关闭我的应用程序。

它不仅删除了通知,还解决了重新连接到iTunes的问题。正确释放COM对象让我无需重新启动iTunes即可无缝地禁用/启用程序的监听器。