tl; dr 버전 : WinForms 단추의 MouseDown 이벤트에서 소리를 재생하고 같은 단추의 MouseUp 이벤트에서 재생하지 못하게하려면 어떻게해야합니까?mouseUp 이벤트의 SoundPlayer를 중지하십시오.
중간급 C# dev 여기에서 간단한 Simon 복제본을 작성하려고했습니다.
사용자가 버튼을 클릭하는 동안에 만 색상이 지정된 버튼의 사운드가 재생되도록 노력하고 있습니다. (나는 "버튼"과 상호 교환 "타일"을 사용 모두 사용자가 양식에 누를 것이다 색깔의 버튼을 참조하십시오.) 나는 원래이 시도
:
public partial class frmMain : Form
{
private SoundPlayer soundPlayer;
private void btnGreenTile_MouseDown(object sender, MouseEventArgs e)
{
soundPlayer = new SoundPlayer(Properties.Resources.greenTileSound)
soundPlayer.Play();
}
private void btnGreenTile_MouseUp(object sender, MouseEventArgs e)
{
soundPlayer.Stop();
}
}
을하지만이 멈추지 않았다 MouseUp 이벤트는 MouseDown이 끝나지 않아 시작되지 않았기 때문에 소리가 들리지 않습니다 (누군가가 간단한 클릭보다 오랫동안 버튼을 누르고있는 경우에도 5 초 길이의 소리를 계속 재생 함).
Luis Tellez가 언급 한 것처럼 SoundPlayer는 사운드를 새로운 스레드에서 재생하므로 ...이 코드가 지금 작동하지 않는 이유를 알 수 없습니다. 그것은 이는 MouseUp에 소리 재생을 중지하지 않고, 더 나은 그것은 "스레드가 실행되거나 메시지와 함께 ThreadStateException을 던져, 위의 코드와
public partial class frmMain : Form
{
private Thread soundThread = new Thread(new ParameterizedThreadStart(PlaySound));
// Create stream objects for each sound (needed to allow SoundPlayer to use Resources)
private Stream greenTileSound = Properties.Resources.greenTilePress;
private Stream redTileSound = Properties.Resources.redTilePress;
private Stream yellowTileSound = Properties.Resources.yellowTilePress;
private Stream blueTileSound = Properties.Resources.blueTilePress;
public frmMain()
{
InitializeComponent();
}
private void btnGreenTile_MouseDown(object sender, MouseEventArgs e)
{
soundThread.Start(greenTileSound);
}
private void btnGreenTile_MouseUp(object sender, MouseEventArgs e)
{
soundThread.Abort();
}
// Have to use object as parameter because ParamterizedThreadStart() only takes object arguments
private static void PlaySound(object soundToPlay)
{
SoundPlayer soundPlayer = new SoundPlayer((Stream)soundToPlay);
soundPlayer.Play();
}
}
:
그래서 나는 멀티 스레딩에보고하고이 시도 종료되었으며 재시작 할 수 없습니다. "
아마도이 코드를 작성하는 동안 멀티 스레딩에 대해서 배웠을 것입니다. 스레드가 시작될 때 호출하는 메서드 인 PlaySound()가 player (.wav 파일)가 누른 채색 된 단추에 해당하는 리소스로 soundPlayer에 매개 변수를 전달해야하므로 ParameterizedThreadStart를 사용해야합니다.
는 그때 ... 어쩌면 내가 soundThread.Suspend() 대신 soundThread.Abort()을 사용하려고하지만 사용되지 않습니다 일시 중단해야 생각사람에게 소리를 얻기 위해 올바른 방향으로 날 지점 수 MouseUp에서 중지 하시겠습니까? 멀티 스레딩 작업이 필요합니까? 나는 내 문제가 논리로 내려 왔다고 생각하지만 완전히 붙어있다. 모든 도움에 감사드립니다! :)
부수적으로, 나는이 질문이나 뭔가가 아직 (적어도 Google 검색 또는 stackExchange 검색으로 찾을 수 없음) 묻지 않았 음에 놀랐습니다.
나는 문제 (첫째, 비는 스레드 방식)을 재현하려고했으나 정확한 파일 위치를 SoundPlayer를 가리키는 것이 아니라 스트림을 사용하여를하고 그것을 잘 작동하므로 시도했습니다 스트림이 어떻게 작동하는지 살펴 보려면 문제가있을 수 있습니다. –
스크래치는 스트림과도 작동합니다. 'Properties.Resources.greenTilePress'의 코드는 무엇입니까? –
Properties.Resources.greenTilePress는 리소스 (.wav 파일)입니다. Visual Studio 프로젝트를 추가하여 EXE에 포함 시켰습니다. 귀하의 의견 후 다시 스레드가 아닌 접근 방식을 시도하고 효과가 (나는 문자 그대로 복사하고 여기에서 코드를 붙여 넣습니다). 나는 그것이 왜 작동하지 않았는지 전혀 모른다. 당신의 도움을 주셔서 감사합니다! –