我正在尝试创建一个简单的媒体播放器,它只使用上下文菜单条从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
这是文件选择开始的地方
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();
}
}
答案 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非常感谢所有帮助过的人。