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 は、チップを搭載していないすべてのコンピューターで機能するわけではありませんでした。ほとんどの開発者は、8254 チップの代わりにデフォルトのサウンド デバイスを使用する MessageBeep 関数を呼び出すようになったので、これは問題ありませんでした。

最終的に通信するハードウェアが不足したため、Windows Vista および Windows XP 64 ビット版では Beep のサポートが廃止されました。

Windows 7 では、Beep が書き直され、ビープ音がセッションの既定のサウンド デバイスに渡されるようになりました。通常、これはサウンド カードです。ただし、ターミナル サービスで実行されている場合を除きます。この場合、ビープ音はクライアントでレンダリングされます。

Larry Osterman のブログで、さらに詳しい情報を見つけることができます: What's up with the Beep driver in Windows 7?

したがって、Windows 7 で動作するはずですが、コンピューターにサウンド ジェネレーター ハードウェアがインストールされていて、スピーカーが接続されていて、電源が入っている必要があります。もちろん、MessageBeep機能も同様です。

于 2013-04-12T22:10:27.003 に答える