C 在Win32 SDK中使用PlaySound时,如何检测声音何时播放完毕?
我正在使用Win32 SDK中的C 在Win32 SDK中使用PlaySound时,如何检测声音何时播放完毕?,c,windows,winapi,playsound,C,Windows,Winapi,Playsound,我正在使用Win32 SDK中的PlaySound函数来播放wave sound文件。目前,我有以下代码行: PlaySound(szFile,NULL,SND_FILENAME ); 但是现在我想知道,我怎样才能检测到wave文件完成播放的时间?我想在wave停止播放时更改按钮的文本。除非您指定SND_ASYNC标志,否则它是同步的,这意味着在您调用它之后,它不会将控制权返回到您的程序,直到它完成声音文件的播放 因此,一旦函数返回一个值(如果成功,则返回TRUE,否则返回FALSE),您就知
PlaySound
函数来播放wave sound文件。目前,我有以下代码行:
PlaySound(szFile,NULL,SND_FILENAME );
但是现在我想知道,我怎样才能检测到wave文件完成播放的时间?我想在wave停止播放时更改按钮的文本。除非您指定
SND_ASYNC
标志,否则它是同步的,这意味着在您调用它之后,它不会将控制权返回到您的程序,直到它完成声音文件的播放
因此,一旦函数返回一个值(如果成功,则返回TRUE
,否则返回FALSE
),您就知道声音已经播放完毕
您只需在调用
PlaySound
函数后立即在下一行代码中更新按钮控件的文本即可。如果要确保按钮立即更新以反映您的更改,您可能还需要调用。除非指定SND_ASYNC
标志,否则按钮是同步的,这意味着在调用它之后,在播放完声音文件后,它才会将控制权返回到您的程序
因此,一旦函数返回一个值(如果成功,则返回TRUE
,否则返回FALSE
),您就知道声音已经播放完毕
您只需在调用
PlaySound
函数后立即在下一行代码中更新按钮控件的文本即可。如果要确保按钮立即更新以反映您的更改,您可能还需要调用。PlaySound的功能非常有限。在我开发的一款产品中,我们在DirectSound之上构建了一个媒体播放库,以克服这些限制。在它所做的许多事情中,包括编写WAV文件解析器和线程代码,以将PCM样本流保存到DirectSound缓冲区中。不适合胆小的人
你可以走这条路,但这里有一些简单的建议
PlaySound的功能非常有限。在我开发的一款产品中,我们在DirectSound之上构建了一个媒体播放库,以克服这些限制。在它所做的许多事情中,包括编写WAV文件解析器和线程代码,以将PCM样本流保存到DirectSound缓冲区中。不适合胆小的人 你可以走这条路,但这里有一些简单的建议
使用
SND\u ASYNC
仍然无法获得wave文件的停止播放时间点。@tunpishuang:是的。我说过不要使用SND_ASYNC
。如果使用SND_SYNC
并且wave文件很长,用户必须等到播放结束,但不能中断播放,因为windows消息循环不会运行并等待播放结束。这对节目也不好。@tunpishuang:像这样的信息应该在你的问题中。如果你想播放一个长的声音文件,我认为这值得一提。不要强迫我们猜测细节。对不起,我不能很好地解释我的问题,因为我的英语很差。xD thx.usingSND_ASYNC
仍然无法获得wave文件的停止播放时间点。@tunpishang:是的。我说过不要使用SND_ASYNC
。如果使用SND_SYNC
并且wave文件很长,用户必须等到播放结束,但不能中断播放,因为windows消息循环不会运行并等待播放结束。这对节目也不好。@tunpishuang:像这样的信息应该在你的问题中。如果你想播放一个长的声音文件,我认为这值得一提。不要强迫我们猜测细节。对不起,我不能很好地解释我的问题,因为我的英语很差。反正是xD thx。@Cody。我不知道询问者的情况,但我认为如果他的声音足够长,他不想阻止他的UI线程。否则,当声音播放时,他的UI将显示为冻结和无响应。他可以使用SND_ASYNC,但他无论如何也不知道声音何时结束播放。是的,这当然是合理的。我没有认为声音文件很长,而且问题没有给出。