【问题标题】:Make PlaySound non-blocking使 PlaySound 无阻塞
【发布时间】:2025-12-28 13:45:12
【问题描述】:

我一直在测试声音,我注意到 PlaySound 正在阻塞,即它一直等到声音播放完毕才返回。

#include <iostream>
#include <Windows.h>
#include <mmsystem.h>

int main()
{
    PlaySound("E:/Downloads/eb_sfx_archive/brainshock.wav", 0, SND_FILENAME);
    std::cout << "this sound is cool";
    Sleep (500);
    std::cout << "\nmeh... not really";
    return 0;
}

此代码播放声音,但它会等待输出“这个声音很酷”,直到声音播放完毕。我怎样才能让它不那样做?

【问题讨论】:

    标签: c++ windows audio


    【解决方案1】:

    异步播放声音:

    PlaySound(L"E:\\Downloads\\eb_sfx_archive\\brainshock.wav", NULL, SND_ASYNC);
    

    来自MSDN 文档:

    声音是异步播放的,PlaySound 在声音开始后立即返回。要终止异步播放的波形声音,请调用 PlaySound 并将 pszSound 设置为 NULL

    【讨论】:

    • 不错的收获。这是页面:msdn.microsoft.com/en-us/library/windows/desktop/…SNDASYNC:“声音是异步播放的,PlaySound 在开始声音后立即返回。要终止异步播放的波形声音,请在 pszSound 设置为 NULL 的情况下调用 PlaySound。”
    【解决方案2】:

    使用标志SND_ASYNC 异步播放声音。

    即:

    PlaySound("E:/Downloads/eb_sfx_archive/brainshock.wav", 0, SND_FILENAME | SND_ASYNC);

    SND_ASYNC 标志使PlaySound 立即返回,而无需等待声音播放完毕。

    此外,如果您需要停止播放声音(循环或异步)而不播放其他声音,请使用以下语句:

    PlaySound(NULL, NULL, 0);

    更多信息和示例here(使用 PlaySound 循环声音)和here(PlaySound 功能)。

    【讨论】:

    • 按位或,非逻辑或。 |,不是,||。我帮你修好了。
    • 是的,完全同意。对不起!
    • 这行得通,但是一旦程序输出“meh, not really”,声音就会中断
    • 我想是因为程序结束了吧?