首页 > 解决方案 > 如何反复检查状况

问题描述

前段时间,我问了一个关于在C#程序中播放.mp3文件的问题。由于答案真的很有帮助,我决定在这里再次提出其他问题。我有一个代码:

WMPLib.WindowsMediaPlayer wplayer = new WMPLib.WindowsMediaPlayer();

if (wplayer.playState == WMPLib.WMPPlayState.wmppsMediaEnded)
{
     *something to do...*
}
else
{
}

在“else”的括号之间,我需要学习我的程序,例如:“当播放状态更改回到这个 if 条件时”(这基本上意味着说他:“只有当播放状态更改为“媒体结束”时才做我写的有事做”) 所以这是我的问题。怎么做?是否有任何“检查值”命令或对我有帮助的命令?谢谢您的回答!

标签: c#windowsformsmedia

解决方案


查看有关WindowsMediaPlayer 支持的 PlayStateChange 事件的完整文档

如果您不知道eventC# 中的内容是什么:

事件服务于您描述的目的 - 它们在发生某些事情时通知(发生这种事情的时间和原因由类开发人员定义)。在我们的例子中,WindowsMediaPlayer有一个事件PlayStateChange,当对象的播放状态改变时触发。

所以现在,即使玩家改变了它的状态并且事件是由类触发的,我们也永远不会知道它,因为我们从来没有订阅过接收来自事件的通知。

为此,您编写自己的函数(通常称为处理程序)。这个函数应该有一个特定的签名——它应该返回void并接受两个参数:第一个类型object(您可以将其转换为 WindowsMediaPlayer 类型,因为这种类型是我们事件的来源),第二个类型带有事件的补充数据)

一个例子直接来自上面的链接:

private void player_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
   // this code is executed when the playstate changed
   // no need to check - developers of the WindowsMediaPlayer class
   // tell you, that it happened, by calling this function
   // they even give you some data about this changed state via arguments (sender and e above)

   // Test the current state of the player and display a message for each state.
   switch (e.newState)
   {
        case 0:    // Undefined
            currentStateLabel.Text = "Undefined";
            break;

        case 1:    // Stopped
            currentStateLabel.Text = "Stopped";
            break;
        ... // check the link for more states
   }
}

接下来,您必须为该事件订阅这个新编写的函数。所以当播放状态改变时,播放器类会调用我们的函数:

// Add a delegate for the PlayStateChange event.
player.PlayStateChange += new AxWMPLib._WMPOCXEvents_PlayStateChangeEventHandler(player_PlayStateChange);

所以基本上,你有一个函数接受关于事件的两个参数,当对象的事件被触发player_PlayStateChange时,这个函数被调用。令人困惑的是一个类,它只是包装了我们的函数,你只能在包装后附加一个函数。PlayStateChangeplayerAxWMPLib._WMPOCXEvents_PlayStateChangeEventHandler

我鼓励您在更简单易懂的示例或教程中了解有关 C# 中的事件和委托的更多信息。事件的概念对于编程至关重要。


推荐阅读