C # MP3-плеер с использованием winmm.dll - PullRequest
1 голос
/ 02 марта 2010

Я пытаюсь собрать воедино (очень) грубый MP3-плеер во время обеденного перерыва, и пока у меня есть его для воспроизведения файлов, и я работаю над способом составления списка имен файлов для включить случайные песни, но я думаю, что я только что наткнулся на загадку.

Есть ли способ узнать, когда заканчивается воспроизведение MP3 в настоящее время? Событие или что-то подобное? В настоящее время я не думаю, что смогу иметь плейлисты и т. Д., Если это было невозможно из-за остановки после каждого воспроизведения.

Я привел весь источник ниже, не стесняйтесь, чтобы выбрать его и дать мне любые ваши отзывы, ура.

using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace X
{
public partial class Form1 : Form
{
    List<string> Names = new List<string>();
    StreamReader reader = File.OpenText(@"C:\X.txt");
    string line;
    OpenFileDialog ofd = new OpenFileDialog();
    StringBuilder buffer = new StringBuilder(128);
    string CommandString;
    [DllImport("winmm.dll")]
    private static extern long mciSendString(string lpstrCommand, StringBuilder lpstrReturnString, int uReturnLength, int hwndCallback);
    public Form1()
    {
        InitializeComponent();
        while ((line = reader.ReadLine()) != null)
        {
            if (line.Trim() != "")
            {
                Names.Add(line.Trim());
            }
        }
    }

    private void btnplay_Click(object sender, EventArgs e)
    {
        if (ofd.FileName == "")
        {
            if (ofd.ShowDialog() == DialogResult.OK)
            {
                ofd.Filter = "MP3 Files|*.mp3";
                CommandString = "open " + "\"" + ofd.FileName + "\"" + " type MPEGVideo alias Mp3File";
                mciSendString(CommandString, null, 0, 0);
                CommandString = "play Mp3File";
                mciSendString(CommandString, null, 0, 0);
            }
        }

        else
        {
            CommandString = "play Mp3File";
            mciSendString(CommandString, null, 0, 0);
        }
    }

    private void btnpause_Click(object sender, EventArgs e)
    {
        CommandString = "pause mp3file";
        mciSendString(CommandString, null, 0, 0);
    }

    private void btnbrowse_Click(object sender, EventArgs e)
    {
        ofd.Filter = "Mp3 files |*.mp3";
        if (ofd.ShowDialog() == DialogResult.OK)
        {
            txtpath.Text = ofd.FileName;
            CommandString = "close Mp3File";
            mciSendString(CommandString, null, 0, 0);
            CommandString = "open " + "\"" + ofd.FileName + "\"" + " type MPEGVideo alias Mp3File";
            mciSendString(CommandString, null, 0, 0);
        }
    }
}
}

1 Ответ

2 голосов
/ 02 марта 2010

Вы можете получить уведомление от команды mcisendstring при вызове mcisendstring для открытия файла, просто отправив дескриптор своей формы и переопределив метод wndproc своей формы, после чего вы можете получить уведомление из примера кода MCI следующим образом.

 private void btnplay_Click(object sender, EventArgs e)
{
    if (ofd.FileName == "")
    {
        if (ofd.ShowDialog() == DialogResult.OK)
        {
            ofd.Filter = "MP3 Files|*.mp3";
            CommandString = "open " + "\"" + ofd.FileName + "\"" + " type MPEGVideo alias Mp3File";
            mciSendString(CommandString, null, 0, this.Handle.ToInt64());
            CommandString = "play Mp3File";
            mciSendString(CommandString, null, 0, this.Handle.ToInt64());
        }
    }

    else
    {
        CommandString = "play Mp3File";
        mciSendString(CommandString, null, 0, this.Handle.ToInt64());
    }
}

// Declare the nofify constant
public const int MM_MCINOTIFY = 953;

// Override the WndProc function in the form
protected override void WndProc(ref Message m) 
{

    if (m.Msg == MM_MCINOTIFY)
    {
        // The file is done playing, do whatever
    }
    base.WndProc(ref m);
}
...