0

プレイリスト機能を備えた MP3 プレーヤーを作成しようとしています。どこでもグーグル検索し、例を試しましたが、何も機能しません。コードがフリーズするのはp[ListBox1.SelectedIndex + 1];が呼び出されたときで、なぜプログラムがフリーズするのかわかりません。配列を作成して、それを介して次の曲を選択しようとしましたが、それもうまくいきませんでした。

これが最も簡単な方法だと思います。しかし、何らかの理由でプログラムがロックされます。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.Threading;
using System.Collections;

namespace MusicPlayer
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    string[] f, p;
    ArrayList playlist = new ArrayList();
    private int current_index = 0;

    private void button1_Click(object sender, EventArgs e)
    {
        OpenFileDialog open = new OpenFileDialog();

        if(openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK){
            f = openFileDialog1.SafeFileNames;
            p = openFileDialog1.FileNames;

            for (int i = 0; i < f.Length; i++)
            {
                listBox1.Items.Add(f[i]);
            }

            foreach (string d in open.FileNames)
            {
                listBox1.Items.Add(d);
            }
        }
    }

    private void listBox1_MouseDoubleClick(object sender, MouseEventArgs e)
    {
        axWindowsMediaPlayer1.URL = p[listBox1.SelectedIndex];
    }


    private void Form1_Load(object sender, EventArgs e)
    {
        axWindowsMediaPlayer1.PlayStateChange += new AxWMPLib._WMPOCXEvents_PlayStateChangeEventHandler(MediaPlayer_PlayStateChange);
    }

    public void MediaPlayer_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
    {
        switch (axWindowsMediaPlayer1.playState)
        {
            // Locks up here
            case WMPLib.WMPPlayState.wmppsReady:
                axWindowsMediaPlayer1.URL = p[listBox1.SelectedIndex + 1];
                break;
            case WMPLib.WMPPlayState.wmppsStopped:
                axWindowsMediaPlayer1.URL = p[listBox1.SelectedIndex + 1];
                break;
            default:
                break;
        }
    }
}
}

編集:

コードを更新したところ、次のようになりました。

public void MediaPlayer_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
 switch (axWindowsMediaPlayer1.playState)
 {
   case WMPLib.WMPPlayState.wmppsReady:                                     
    axWindowsMediaPlayer1.BeginInvoke(new Action(change_song));
    break;
    case WMPLib.WMPPlayState.wmppsStopped:
     axWindowsMediaPlayer1.BeginInvoke(new Action(change_song));
     break;
     default:
     break;
}
}

void change_song()
{
  axWindowsMediaPlayer1.URL = p[listBox1.SelectedIndex + 1];
}

しかし、これを実行すると、「メディアの変更」でスタックし、最終的に何もしません。

4

0 に答える 0