コマンドプロンプトから音を出す方法
Windows のコマンドプロンプトから音を出す方法をいくつか紹介します。
動作確認環境
- Windows 10 Home 21H1, 64bit
方法 1. 「^G」を出力して音を出す
コマンドプロンプトから「^G」を出力することで音を出すことができます。「^G」と表記していますが、これはバイナリデータの「0x07」、ASCII コードの「BEL」を意味します。
echo コマンドを使って「^G」を出力してみましょう。
- コマンドプロンプト (cmd.exe) を起動します。
- 「echo ^G」と入力し、[Enter] キーを押します。「^G」は [Ctrl] キーを押しながら [G] キーを押します。[^] キーを押してから [G] キーを押すわけではありません。
出力される音は、コントロールパネルの[サウンド]で「システムエラー」として登録されたサウンドになります。Windows API の MessageBeep(MB_ICONERROR); で再生されるサウンドと同じです。
【詳細】
「echo ^G」を実行すると、出力バッファに「0x07 0x0D 0x0A」を詰めた状態で WriteConsole 関数が呼び出されます。
方法 2. 「rundll32」コマンドで音を出す
コマンドプロンプトから、Windows 付属の「rundll32」コマンドを使って Windows API の「MessageBeep」関数を呼び出すことで音を出すことができます。
実際に試してみましょう。
- コマンドプロンプト (cmd.exe) を起動します。
- 「rundll32 user32.dll,MessageBeep」と入力し、[Enter] キーを押します。
出力される音は、コントロールパネルの[サウンド]で「一般の警告音」として登録されたサウンドになります。Windows API の MessageBeep(MB_OK); で再生されるサウンドと同じです。
【詳細】
正確には MessageBeep(MB_OK);、言い換えると MessageBeep(0); が実行されているわけではありません。rundll32 コマンドは、MessageBeep 関数の引数として、自身が内部的に生成したウィンドウのハンドルを渡します。この値は不定であり、たとえば「0x000b0694」だったり「0x000c0846」だったりします。MessageBeep 関数はこのような不適切な値を受け取ると、デフォルトのサウンドを鳴らします。それが MessageBeep(MB_OK); と同じサウンドというだけです。
方法 3. 「choice」コマンドで音を出す
Windows 付属の「choice」コマンドを使って音を出すことができます。
「choice」コマンドは [Y] や [N] などのキー入力を待ち受けるコマンドですが、規定外のキーを入力すると警告音を鳴らします。これを利用します。
実際に試してみましょう。
- コマンドプロンプト (cmd.exe) を起動します。
- 「echo XY | choice」と入力し、[Enter] キーを押します。
「choice」コマンドで入力を待ち受けている状態で、最初に無効な [X] キーを流し込んで警告音を鳴らし、続いて有効な [Y] キーを流し込んでコマンドを終了させています。
画面に [Y,N]?Y というメッセージが表示されるのが邪魔な場合は、「echo XY | choice > nul」とし、nul にリダイレクトしてください。
【詳細】
「choice」コマンドの警告音は Beep(1500, 500); です。すなわち、1500 ヘルツ 500 ミリ秒です。