第07回 再生位置をシークバーで移動する

前回「第06回 再生位置をシークバーに表示する」はシークバーに現在の再生位置を表示しました。
今回はシークバーを操作することで再生位置を自由に設定できるようにします。

トラックバーを操作するとき=トラックバーにフォーカスがある
という等式を利用した簡易的な実装にしました。
そのためトラックバーにフォーカスがあるとシーク位置が更新されません。

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

namespace MP3Player
{
	public partial class Form1 : Form
	{
		WindowsMediaPlayer _mediaPlayer = new WindowsMediaPlayer();

		Timer _timer = new Timer();

		List<string> _liststrFiles;			//音楽ファイル一覧
		int _nCurrentIndex = -1;			//↑へのインデックス

		public Form1()
		{
			InitializeComponent();

			_liststrFiles = EnumFiles(@"G:\Desktop\mp3\");		//再生したいmp3保存フォルダを指定

			//追加
			//フォームが表示されたときの処理
			Shown += delegate
			{
				//シークバーにフォーカスがあると、再生位置が表示されないのでここで再生ボタンにフォーカスを与える
				buttonPlay.Focus();
			};

			//追加
			//再生位置のシーク
			trackBarSeek.ValueChanged += delegate
			{
				if (trackBarSeek.Focused)
				{
					_mediaPlayer.controls.currentPosition = (double)trackBarSeek.Value / 100;
				}
			};


			_timer.Interval = 300;			//300msecごとに処理を実行
			_timer.Tick += delegate
			{
				if (_mediaPlayer.playState == WMPPlayState.wmppsPlaying || _mediaPlayer.playState == WMPPlayState.wmppsPaused)
				{
					//変更
					trackBarSeek.Maximum = (int)(_mediaPlayer.controls.currentItem.duration * 100);
					//シークバーにフォーカスがないときだけ再生位置を表示する
					if (trackBarSeek.Focused == false)
					{
						try
						{
							//シークバーに再生位置を表示
							//曲変更タイミングによっては例外出る可能性ある
							trackBarSeek.Value = (int)(_mediaPlayer.controls.currentPosition * 100);
						}
						catch (Exception)
						{
						}
					}

					//再生時間の表示
					labelTime.Text = _mediaPlayer.controls.currentPositionString;
				}

				//止まっていたら再び再生
				if (_mediaPlayer.playState == WMPPlayState.wmppsStopped)
				{
					Play();
				}
			};
			_timer.Start();

			_mediaPlayer.settings.volume = 20;
			Play();
		}

プロジェクトファイルをダウンロード


カテゴリー「MP3プレーヤーを作る(C#)」 のエントリー