为啥 Beep 功能在 Windows 10 上不起作用

Posted

技术标签:

【中文标题】为啥 Beep 功能在 Windows 10 上不起作用【英文标题】:Why doesn't Beep function work on Windows 10为什么 Beep 功能在 Windows 10 上不起作用 【发布时间】:2019-02-22 11:29:29 【问题描述】:

我在使用 Dev C++ 用 C 语言进行 Beep 函数编程时遇到问题。

我需要持续 25 毫秒的哔声,我正在使用的代码行是

Beep (1000, 25)

这在 Windows 8/8.1 上运行良好,我得到了我想要的。 但是当我在 Windows 10 上运行相同的程序时,它没有发出哔哔声!我试图增加持续时间,然后我注意到如果它是 100 毫秒或更长,它会发出哔哔声......

有什么想法吗? 这可能是与硬件相关的原因造成的吗?

【问题讨论】:

“这可能是由硬件相关的东西引起的吗?” 可能是这样。根据docs.microsoft.com/en-us/windows/desktop/api/utilapiset/…,“Beep 函数是专门为在该硬件上发出哔声而编写的。”和“[...] 结果是 Beep 不能在所有没有芯片的计算机上工作。这没关系,因为大多数开发人员已经开始调用 MessageBeep 函数” 然而,从 Windows 7 开始,它的行为是使用声卡模拟的。快速搜索显示这个 100 毫秒的问题很常见,这可能是对如何实现此 模拟 的限制。如果你需要精确的时间,那么你应该避免使用Beep(),如果你不需要,那么你应该使用MessageBeep()PlaySound()。如果您需要对生成的波形进行精细控制,那么您应该使用waveOut*() 系列函数。 哦,好的!谢谢!我需要精确的时间并控制频率,所以我想我会按照你的建议使用 waveOut 函数系列!谢谢!! 【参考方案1】:

我不认为这是 Windows 本身的限制,我有这个程序,当给出你在问题中描述的参数时,它似乎可以正常工作(虽然 25 毫秒是一个非常短的信号,但仍然可以听到)。

虽然它是在 Visual Studio 2019 下编译的,但我认为这不会产生影响。

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

int errorExit(char *str) 
    std::cerr << str << std::endl;
    return 1;


int main(int argc, char *argv[]) 
    if (argc != 3)
        return errorExit("beep: Usage: beep <frequency> <duration-in-millisecs>");

    int freq = std::atoi(argv[1]);
    if ((freq < 37) || (freq > 32767))
        return errorExit("beep: Frequency must be 37-32767 inclusive");

    int duration = atoi(argv[2]);
    if ((duration < 1) || (duration > 10000))
        return errorExit("beep: Duration must be 1-10000 inclusive");

    Beep(freq, duration);

    return 0;

如果您无法让它以您需要的频率和持续时间工作,您可能需要查看PlaySound 之类的东西,它可以使用任意音频文件,而不仅仅是简单的哔哔声。然后将简单的哔声放入音频文件(使用 Audacity 或其他工具)并播放。

【讨论】:

以上是关于为啥 Beep 功能在 Windows 10 上不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Windows Beep 在 Windows 7 凭据提供程序中不发出声音

为啥 Windows 在 KeyDown 上播放哔声,但在 DoubleClick 上不播放?

为啥默认情况下 #include<bits/stdc++.h> 在 Windows 上不起作用?

为啥远程推送通知在 iOS 10 上不起作用?

为啥这个智能合约功能在使用 web3 提供程序的 Remix IDE 上不起作用?

为啥 chrome 远程调试在我的三星 Galaxy S10 上不起作用?