0

現在の曲を無数にループするコードを実装しようとしています。

それが私のコードです:

private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
    if (e.newState == 8) // media ended
    {
        if (repeat)
        {
            axWindowsMediaPlayer1.Ctlcontrols.currentPosition = 0;

            //axWindowsMediaPlayer1.Ctlcontrols.previous();
            //axWindowsMediaPlayer1.Ctlcontrols.playItem(axWindowsMediaPlayer1.Ctlcontrols.currentItem);
        }
    }
}

currentPosition = 0次の行でコードをデバッグすると、設定は正常に機能します。

しかし、デバッグ後 - 新しいイベントがトリガーされ (イベント 9(Transitioning) に続いてイベント 3(Playing))、次の曲の再生が開始されます!

これを防ぐにはどうすればよいですか?

基本的にそれが今起こっていることです:

  • イベント 8 のトリガー (メディア エンド)
  • 設定位置 0
  • イベント 9 のトリガー (移行中)
  • イベント 3 トリガー (再生中)

編集:コードをいじった後、最終的にイベントの変更の連鎖を断ち切ることができました。

public bool ended = false;
public WMPLib.IWMPMedia latest_song;

private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
    if (ended)
    {
        axWindowsMediaPlayer1.Ctlcontrols.playItem(latest_song);
        ended = false;
        return;
    }

    if (e.newState == 8) // media ended
    {
        if (repeat)
        {
            ended = true;
            latest_song = axWindowsMediaPlayer1.Ctlcontrols.currentItem;
        }
    }
}

コードがこれよりも良くなるかどうかはわかりません..

4

1 に答える 1

1
bool ended = false;
bool skipnext = false;
bool skipnextnext = false;
bool skipextra = false;

private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
    if (ended)
    {
        skipnext = true;
        ended = false;
        axWindowsMediaPlayer1.Ctlcontrols.playItem(latest_song);
        return;
    }

    if (e.newState == 6) // buffering
    {
        skipextra = true;
    }

    if (e.newState == 8) // media ended
    {
        if (repeat)
        {
            if (currect_album.Songs.Count < 2) { return; }
            ended = true;
            latest_song = current_song;
            return;
        }
    }
    else if (e.newState == 3) // playing
    {
        // these "skips" are necessary for scenario: "repeat: on", "click: next"
        if (skipnext) { skipnext = false; skipnextnext = true; return; }
        if (skipnextnext) { skipnextnext = false; return; }
        // Buffering adds 1 more skip! Ask Microfost why ;)
        if (skipextra) { skipextra = false; return; }

        current_song = axWindowsMediaPlayer1.Ctlcontrols.currentItem;
        // your stuff
    }
}
  • 最初の解決策は半日でうまくいきました;)
  • 2番目の解決策は「繰り返し」には機能しましたが、ユーザーが「次へ」をクリックした場合には機能しませんでした
  • 3番目で最後の(私が望む)解決策は、「繰り返し」が必要な状況で最終的に機能し、さらに「次/前」コマンドがトリガーされると曲をスキップします!
  • 第四版!バッファリングが開始された場合、追加の「スキップ」を追加しました。バッファリングは私のコードを少し台無しにしましたが、今ではすべて機能しています。さらに、「プレイリストに 1 曲」チェッカーを追加しました。

PS Microsoft コーダー - この投稿を見たら - "on_next" と "on_previous" ステータスを追加してください! ありがとう

于 2013-03-22T16:02:27.020 に答える