我的音乐播放器为每个曲目显示相同表单的多个实例

时间:2016-11-29 12:48:30

标签: c#

我正在尝试创建一个简单的媒体播放器,它只使用上下文菜单条从notifyIcon托盘运行,坐在隐藏的表单上。

当我点击菜单项时,播放mp3' s'它打开了一个文件夹,允许我选择一堆mp3曲目。这些轨道存储在隐藏表单的列表框中,允许我通过C#代码操作它们。我所拥有的代码将始终播放第一首歌,没问题,但之后的那些是痛苦的。

我发现让歌曲继续播放的方式是对每首歌使用ShowDialog,但正如你猜测那意味着有多个相同形式的实例。当我停止使用show.dialog时,我又回到了一首歌。是因为我在没有表格上的实际玩家的情况下使用WMPLib,我确信情况并非如此。我已经设法在这里获取了大量的知识,以便让我走到这一步,比如使用PlayStateChange,能够选择列表框中的下一个项目以及如何播放歌曲列表。不幸的是,大部分时间都是使用媒体播放器控制台和按钮。

以下是引起问题的具体代码,因为它会播放每个曲目,当我评论showdialog时,它只播放第一首歌。

private void trackplayer()
{
    listBox1.SelectedIndex = listBox1.SelectedIndex + 1;
    var selectedUrl = listBox1.SelectedItem.ToString();
    player.URL = selectedUrl;
    player.controls.play();
    mytempFormOpen();
}

public void mytempFormOpen()
{
    var myform1 = new Form1();
    myform1.ShowDialog();
}

你能帮助一个沮丧的新手,我很乐意回答的任何问题。

这是我的FormLoad部分

#region check internet when form opens
private void Form1_Load(object sender, EventArgs e)
{
    notifyIcon1.Text = (playingToolStripMenuItem.Text);
    checkTheInternet();
}
#endregion

Here is the Internet Checker Code called from the loadform

#region Check for Internet Connection Loop
private void checkTheInternet()
{
while (true)
{
bool con = NetworkInterface.GetIsNetworkAvailable();
if (con == false)
{
MessageBox.Show("No Internet Connection!");
playingToolStripMenuItem.Text = "No Internet Connection!";
notifyIcon1.Icon = radio_Off;
notifyIcon1.Visible = true;
return;
}
else
{
return;
}
}
}
#endregion

这是文件选择开始的地方

区域自动播放MP3列表

private void mP3ToolStripMenuItem_Click(object sender, EventArgs e)
{
player.PlayStateChange += new WMPLib._WMPOCXEvents_PlayStateChangeEventHandler(player_PlayStateChange);
string[] files, paths;

OpenFileDialog oFD = new OpenFileDialog();
oFD.Multiselect = true;
oFD.Filter = "Music Files |*.mp3;*.wav";

if (oFD.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
pauseToolStripMenuItem.Visible = true;
files = oFD.SafeFileNames;

for (int i = 0; i < files.Length; i++)
{
listBox1.Items.Add(paths[i]);
myCount = i + 1;
}
trackplayer();
}
}

2 个答案:

答案 0 :(得分:0)

如果需要打开一个新表单来播放你的歌曲,我不知道为什么因为我没有你所有的代码,但你不想要多个表格然后这样做。创建一个私有字段,该字段将保存对表单的引用:

private Form1 prevForm;

将myTempFormOpen更改为:

public void mytempFormOpen()
{
    if (prevForm != null)
    {
        prevForm.Close();
    }
    prevForm = new Form1();
    prevForm.ShowDialog();
} 

同样myTempFormOpen应该MyTempFormOpen遵循.NET命名约定。

同样在checkInternet方法中,如果connection为true,则可以立即返回,而不是先检查false。另外,不确定为什么需要while循环。

如果能解决您的问题,请告诉我。

答案 1 :(得分:0)

我最终通过使用计时器找到答案。可以在此处找到解决方案的答案How to detect when a mp3 file has finished playing非常感谢所有帮助过的人。