1

我想播放类似于错误信息对话框的 Windows 系统声音。

我试过Beep API:

Public Declare Function Beep Lib "kernel32" _
    (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
Beep 200, 2000

问题是它只适用于 XP/2000,但不适用于 Win 7。我还希望能够播放不同的声音。

4

1 回答 1

2

MessageBeep您可以通过调用该函数来播放标准的 Windows 警报声音。要从 VB 6 调用它,您需要编写如下声明:

Public Declare Function MessageBeep Lib "user32" (ByVal wType As Long) As Long

然后您需要指定要播放的哔声类型的常量:

Public Const MB_DEFAULTBEEP As Long = -1   ' the default beep sound  
Public Const MB_ERROR As Long       = 16  ' for critical errors/problems
Public Const MB_WARNING As Long     = 48  ' for conditions that might cause problems in the future
Public Const MB_INFORMATION As Long = 64  ' for informative messages only
Public Const MB_QUESTION As Long    = 32  ' (no longer recommended to be used)

请注意,它们与消息框 (MsgBox) 显示的图标完美匹配。每个可用图标都有与之关联的不同默认警报声音。适用于在消息框中正确使用这些图标的相同指导也适用于将它们用作孤立的、独立的警报声音。

当然,因为这些是标准系统声音,所以不能保证它们总是播放相同的声音。使用的确切声音可由用户配置。但这可能就是你想要的。


至于为什么Beep不起作用,这是一个相当悲伤和复杂的故事。函数文档包含大部分细节:

很久以前,所有 PC 计算机共享一个通用的 8254 可编程间隔定时器芯片,用于生成原始声音。Beep 函数是专门为在该硬件上发出哔声而编写的。
[...]
从那时起,声卡已成为几乎所有 PC 计算机的标准设备。随着声卡变得越来越普遍,制造商开始从计算机中移除旧的计时器芯片。这些芯片也被排除在服务器计算机的设计之外。结果是 Beep 不能在所有没有芯片的计算机上工作。这没关系,因为大多数开发人员已经开始调用 MessageBeep 函数,该函数使用默认声音设备而不是 8254 芯片。

最终,由于缺少可与之通信的硬件,Windows Vista 和 Windows XP 64 位版中放弃了对 Beep 的支持。

在 Windows 7 中,Beep 被重写以将哔声传递给会话的默认声音设备。这通常是声卡,除非在终端服务下运行,在这种情况下会在客户端上呈现哔声。

您可以在 Larry Osterman 的博客上找到更多信息:Windows 7 中的 Beep 驱动程序是怎么回事?

所以它应该可以在 Windows 7 上运行,但它要求您的计算机安装了声音发生器硬件,连接了扬声器,并且它们已打开。当然,MessageBeep功能也是如此。

于 2013-04-12T22:10:27.003 回答