ผมเขียนคลาสมาตัวหนึ่ง ใช้สำหรับเล่นเพลง ครับ
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้ public partial class PathPanel : UserControl
{
public enum MediaStatus
{
Playing,
Stopped,
MediaEnded,
DeleteFile,
MoveNext,
MoveFile,
CopyFile
}
// คลาสสำหรับข้อมูลที่ส่งใน Event
public class MediaStatusChangedEventArgs : EventArgs
{
public MediaStatus Status { get; }
public MediaStatusChangedEventArgs(MediaStatus status)
{
Status = status;
}
}
public PathPanel()
{
InitializeComponent();
MediaPlayer.PlayStateChange += axWindowsMediaPlayer1_PlayStateChange;
}
public string PathSource {
get { return txtpathS.Text; }
set {
if (string.IsNullOrEmpty(value)) return;
txtpathS.Text = value;
if (Properties.Settings.Default.PathS != txtpathS.Text)
{
Properties.Settings.Default.PathS = txtpathS.Text;
Properties.Settings.Default.Save();
OnPathSourceChanged();
}
}
}
public string FindString=>txtFind.Text;
public event EventHandler PathSourceChanged;
protected virtual void OnPathSourceChanged()
{
PathSourceChanged?.Invoke(this, EventArgs.Empty);
}
public string PathTarget
{
get { return txtpathT.Text; }
set
{
if (string.IsNullOrEmpty(value)) return;
txtpathT.Text = value;
if (Properties.Settings.Default.PathT != txtpathT.Text) {
Properties.Settings.Default.PathT = txtpathT.Text;
Properties.Settings.Default.Save();
}
}
}
public event EventHandler PathTargetChanged;
protected virtual void OnPathTargetChanged()
{
PathTargetChanged?.Invoke(this, EventArgs.Empty);
}
public string PathTemp
{
get { return txtPathTemp.Text; }
set
{
if (string.IsNullOrEmpty(value)) return;
txtPathTemp.Text = value;
if (Properties.Settings.Default.PathT02 != txtPathTemp.Text) {
Properties.Settings.Default.PathT02 = txtPathTemp.Text;
Properties.Settings.Default.Save();
}
}
}
public event EventHandler PathTempChanged;
protected virtual void OnPathTempChanged()
{
PathTempChanged?.Invoke(this, EventArgs.Empty);
}
private void btn01_Click(object sender, EventArgs e)
{
string p = FileTor.SelectFolder();
if (!string.IsNullOrEmpty(p)) PathSource = p;
}
private void btn02_Click(object sender, EventArgs e)
{
string p = FileTor.SelectFolder();
if (!string.IsNullOrEmpty(p)) PathTarget = p;
}
private void btn03_Click(object sender, EventArgs e)
{
string p = FileTor.SelectFolder();
if (!string.IsNullOrEmpty(p)) PathTemp = p;
}
private void btnNext_Click(object sender, EventArgs e)
{
OnStatusChanged(MediaStatus.MoveNext);
}
public void StopMediaPlayer()
{
MediaPlayer.URL = null;
try
{
MediaPlayer.Ctlcontrols.stop();
}
catch { }
}
string filesong;
public string FileSong
{
get { return filesong; }
set
{
filesong = value;
if (filesong != MediaPlayer.URL)
{
MediaPlayer.URL = filesong;
}
lblStatus.Write($"Retry Play Song:{filesong}");
}
}
// Event สำหรับแจ้งเตือนสถานะ
public event EventHandler<MediaStatusChangedEventArgs> StatusChanged;
// Method สำหรับเรียก Event
protected virtual void OnStatusChanged(MediaStatus status)
{
StatusChanged?.Invoke(this, new MediaStatusChangedEventArgs(status));
}
private void axWindowsMediaPlayer1_PlayStateChange(object sender, AxWMPLib._WMPOCXEvents_PlayStateChangeEvent e)
{
/*
สถานะของการเล่นใน MediaPlayer สามารถแสดงได้ด้วยค่า newState ที่ได้จาก PlayStateChange event ของ pathPanel1.MediaPlayer ในรูปแบบของค่าตัวเลข ดังนี้:
0: Undefined (ไม่ได้กำหนดสถานะ)
1: Stopped (หยุดการเล่น)
2: Paused (หยุดชั่วคราว)
3: Playing (กำลังเล่น)
4: ScanForward (สแกนไปข้างหน้า)
5: ScanReverse (สแกนย้อนกลับ)
6: Buffering (กำลังเตรียมข้อมูล)
7: Waiting (รอการเชื่อมต่อ)
8: MediaEnded (เล่นจนจบ)
9: Transitioning (กำลังเปลี่ยนสถานะ)
10: Ready (พร้อมเล่น)
11: Reconnecting (กำลังเชื่อมต่อใหม่)
ในบางกรณีที่คุณต้องการตรวจสอบสถานะเฉพาะ เช่น เมื่อเล่นไฟล์จนจบ (MediaEnded) คุณสามารถใช้ค่า 8 เป็นตัวแสดงว่าไฟล์เล่นจนจบ.
โดยปกติแล้ว สถานะ 8 (MediaEnded) จะใช้ในการตรวจสอบว่าไฟล์ที่กำลังเล่นเสร็จสิ้นการเล่น.
*/
if (e.newState == 8)
{
lblStatus.Write("MediaEnded");
OnStatusChanged(MediaStatus.MediaEnded);
}
/*else if (pathPanel1.MediaPlayer.playState == WMPLib.WMPPlayState.wmppsPlaying)
{
TimeSpan currentTime = TimeSpan.FromSeconds(pathPanel1.MediaPlayer.Ctlcontrols.currentPosition);
lblStatus.Write( $"{pathPanel1.MediaPlayer.URL}: {currentTime:hh:mm:ss}");
}*/
}
public void Deletefile(string file) {
if(file == filesong)
StopMediaPlayer();
System.IO.File.Delete(file);
if (file == filesong)
OnStatusChanged(MediaStatus.DeleteFile);
}
public void Movefile(string file,string pathT)
{
if (file == filesong)
StopMediaPlayer();
lblStatus.Write(FileTor.MoveFileAsync(file, Path.Combine(pathT, Path.GetFileName(file))));
if (file == filesong)
OnStatusChanged(MediaStatus.MoveFile);
}
public void Copyfile(string file, string pathT)
{
if (file == filesong)
StopMediaPlayer();
lblStatus.Write( FileTor.MoveFileAsync( file, Path.Combine(pathT, Path.GetFileName(file)),false,true));
if (file == filesong)
OnStatusChanged(MediaStatus.CopyFile);
}
private void btnDel_Click(object sender, EventArgs e)
{
Deletefile(filesong);
}
private void btnMove01_Click(object sender, EventArgs e)
{
Movefile(filesong, txtpathT.Text);
}
private void btnMove02_Click(object sender, EventArgs e)
{
Movefile(filesong, txtPathTemp.Text);
}
private void btnCopy01_Click(object sender, EventArgs e)
{
Copyfile(filesong, txtpathT.Text);
}
private void btnCopy02_Click(object sender, EventArgs e)
{
Copyfile(filesong, txtPathTemp.Text);
}
// สร้าง Event ที่จะถูกเรียกเมื่อคลิก btnFind
public event EventHandler FindButtonClicked;
private void btnFind_Click(object sender, EventArgs e)
{
// เมื่อคลิก btnFind, จะเกิด Event นี้
FindButtonClicked?.Invoke(this, EventArgs.Empty);
}
}
แล้วผมก็ เอาไปใช้ใน ฟอร์ม
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้ pathPanel1.StatusChanged += (o, e) => {
if (e.Status == cls.PathPanel.MediaStatus.DeleteFile)
{
dataGridView1.Rows[rowIndex].DefaultCellStyle.BackColor = Color.Red;
}
else if (e.Status == cls.PathPanel.MediaStatus.MediaEnded)
{
dataGridView1.Rows[rowIndex].DefaultCellStyle.BackColor = Color.Moccasin;
}
else if (e.Status == cls.PathPanel.MediaStatus.MoveFile)
{
dataGridView1.Rows[rowIndex].DefaultCellStyle.BackColor = Color.Gold;
}
else if (e.Status == cls.PathPanel.MediaStatus.CopyFile)
{
dataGridView1.Rows[rowIndex].DefaultCellStyle.BackColor = Color.Orange;
}
// เพิ่มการตรวจสอบ rowIndex และสถานะก่อนเรียก RunFile()
//rowIndex++;
/*if (rowIndex <= dataGridView1.RowCount - 2)
RunFile();
Thread.Sleep(3000);
pathPanel1.MediaPlayer.Ctlcontrols.play();*/
string f ;
do {
rowIndex++;
f = dataGridView1[1, rowIndex].Value.ToString();
} while (!File.Exists(f));
pathPanel1.FileSong = f;
dataGridView1.Invoke(new Action(() => dataGridView1.Rows[rowIndex].DefaultCellStyle.BackColor = Color.Gold));
};
ตัวปุ่มกด เล่น เพลง (Next Song) หรือ ปุ่มอื่นๆ ก็ใช้ได้ปกติครับ
แต่ติดตรง เวลา เล่นเสร็จแล้ว หรือ e.Status == cls.PathPanel.MediaStatus.MediaEnded มันจะไม่เล่นต่อตามภาพด้านบนเลยครับ
แต่ว่า
lblStatus.Write($"Retry Play Song:{filesong}");
ที่อยู่ใน
public string FileSong
{
get { return filesong; }
set
{
filesong = value;
if (filesong != MediaPlayer.URL)
{
MediaPlayer.URL = filesong;
}
lblStatus.Write($"Retry Play Song:{filesong}");
}
}
ก็ยังทำงานอยู่นะครับ มีการแสดง ชื่อไฟล์ ปกติ เพียงแต่ไม่เล่นแต่กดเล่นได้ปกติไฟล์ไม่เสียครับ
ขอสอบถามเรื่อง C# เกี่ยวกับการเล่นเพลง หน่อยครับ
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
แล้วผมก็ เอาไปใช้ใน ฟอร์ม
[Spoil] คลิกเพื่อดูข้อความที่ซ่อนไว้
ตัวปุ่มกด เล่น เพลง (Next Song) หรือ ปุ่มอื่นๆ ก็ใช้ได้ปกติครับ
แต่ติดตรง เวลา เล่นเสร็จแล้ว หรือ e.Status == cls.PathPanel.MediaStatus.MediaEnded มันจะไม่เล่นต่อตามภาพด้านบนเลยครับ
แต่ว่า
lblStatus.Write($"Retry Play Song:{filesong}");
ที่อยู่ใน
public string FileSong
{
get { return filesong; }
set
{
filesong = value;
if (filesong != MediaPlayer.URL)
{
MediaPlayer.URL = filesong;
}
lblStatus.Write($"Retry Play Song:{filesong}");
}
}
ก็ยังทำงานอยู่นะครับ มีการแสดง ชื่อไฟล์ ปกติ เพียงแต่ไม่เล่นแต่กดเล่นได้ปกติไฟล์ไม่เสียครับ