【问题标题】:How to make a Beep sound in C on Windows?如何在 Windows 上用 C 语言发出哔声?
【发布时间】:2015-06-12 04:22:57
【问题描述】:

我正在尝试制作一个包含哔声的程序。我在 32 位 Windows Vista 上工作。我正在使用在 GNU 编译器上运行的 Code::Blocks IDE。我的示例代码是 -

#include <stdio.h>
#include <windows.h>
#include <dos.h>

int main(void)
{
    Beep(750, 300);
    printf("\n \n \t This is a dummy program for Beep.");
    getch();

    return 0;
}

在互联网上我读到我们也可以在 printf 中使用 \a 来发出哔声。我试过了,但它不起作用。我检查了我的扬声器和声卡。一切都很完美,但我没有听到哔哔声。甚至我在示例代码中显示的方法也不起作用。

【问题讨论】:

  • 在 C 中,将'\a' 写入标准输出不需要产生声音信号。您是否正在寻找特定于 Windows 的答案?
  • Beep 工作正常,但可能需要消息循环
  • Beep 是否返回非零值?
  • dos.h 适用于 DOS,不适用于 Windows。
  • 你试过了吗:printf("\a");如果你坚持Windows,那么msdn.microsoft.com/en-us/library/windows/desktop/…

标签: c windows audio


【解决方案1】:

这适用于使用 Visual Studio 2017 编译的 Windows 7。没有问题。

printf("\n Bad request - check status code parameter\a");

【讨论】:

    【解决方案2】:

    要使 windows.h 中的 Beep() 函数实际工作,您的 PC 中必须有一个“PC 扬声器”蜂鸣器,如函数文档中所述。因此,您需要有一台相当旧的 PC 并使用 Windows XP 或更早版本,因为在 Windows Vista 中显然放弃了对该功能的支持。

    在较新的 Windows 版本中,使用声卡调用 Beep() 会在扬声器中发出哔声。如果您没有收到任何哔声,则可能与程序无关,而可能与您的特定计算机硬件有关。

    【讨论】:

      【解决方案3】:

      您可以使用\a。至少它可以在我的电脑上运行。

      【讨论】:

      • 问题说他们试过了,但没有用。
      【解决方案4】:

      Beep 从 Windows 7 开始在 Windows 中再次起作用。格式为:

      Beep(frequency, duration) where frequency is the pitch in hertz, and duration is the length in milliseconds
      

      https://msdn.microsoft.com/en-us/library/windows/desktop/ms679277(v=vs.85).aspx

      【讨论】:

        【解决方案5】:

        '\a' 写入标准输出的C 标准recommends 会产生可听或可见的警报信号,但如果标准输出被重定向,它将不起作用。同样,一些较新的计算机缺少 Windows Beep() 和某些终端所依赖的 PC 蜂鸣器。要使 Windows PC 在桌面应用程序中播放警报声音,您可以调用特定于 Windows 的 MessageBeep 函数,该函数“异步”播放声音(在您的程序继续运行时在后台播放)。用户可以在声音控制面板中配置与这四个值中的每一个相关联的声音。

        #include <windows.h>
        
        /* Include one of these in a function */
        MessageBeep(MB_OK);              /* play Windows default beep */
        MessageBeep(MB_ICONINFORMATION); /* play asterisk sound */
        MessageBeep(MB_ICONQUESTION);    /* play question sound */
        MessageBeep(MB_ICONWARNING);     /* play warning sound */
        

        MessageBeep()User32.dll 中定义,所以如果这给您带来链接错误,请确保您链接到相应的导入库。在 MinGW GCC(Code::Blocks 中的编译器)中,将 -lUser32 添加到传递给链接器的库列表中。

        【讨论】:

        • 给未来读者的提示:当我快速尝试这个时,我得到了链接错误,不得不在链接中添加User32.dll。大多数 IDE 生成的 Windows 项目可能包含它,但如果没有,请找到一种方法为您的开发环境添加它(我需要将 LIBS =+ -lUser32 添加到我的测试项目的 qmake .pro 文件中,用于示例)。
        • 您好 Tepples,谢谢您的回答。这是否意味着像在我的示例程序中一样,而不是我使用 Beep();我应该使用 MessageBeep(MB_OK);产生默认的窗口蜂鸣声。
        【解决方案6】:
        MessageBeep(-1);
        

        来自 MSDN 文档:

        MessageBeep 功能

        播放波形声音。每种声音类型的波形声音是 由注册表中的条目标识。

        BOOL WINAPI MessageBeep( _In_ UINT uType ); ... ...

        uType 的值:0xFFFFFFFF

        含义:简单的哔声。如果 声卡不可用,声音是使用扬声器产生的。


        此外,令我惊讶的是,我已经对此进行了测试。至少 Windows 7 32 位(当然也包括 Windows Vista)对旧的 8253 I/O 端口和键盘端口进行某种模拟,可用于环 3 个进程,因此 sound()nosound() 的旧实现应该工作。不幸的是,我没有任何 32 位机器可用的 ATM,所以我无法确认。

        【讨论】:

        • 您好,答案在我的程序中不起作用,因为我的编译器给出错误 - BOOL WINAPI 未声明。在我的 IDE 中它不起作用。请您再次测试您的方法,以免其他用户得到错误的答案。
        • 我已经包含了很多标题。我什至包括 windows.h 和 dos.h
        • 您如何使用 MessageBeep?请写出程序中使用 MessageBeep 的确切行
        • 我没有使用 MessageBeep 作为一行。我已经声明了它,然后我正在调用它。
        • 您不必声明它。 Windows.h 已经声明了它。只需在需要时调用它。
        猜你喜欢
        • 2012-04-21
        • 1970-01-01
        • 2010-09-24
        • 1970-01-01
        • 2011-05-03
        • 2011-05-02
        • 2018-08-30
        • 1970-01-01
        相关资源
        最近更新 更多