为啥 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 上不起作用?