playsound関数を使うと音が鳴ってる間固まるのです


たくろー  2005-11-08 09:43:15  No: 92498

VB6.0で

playsound関数で音を鳴らすと鳴ってる間はキーボードの
入力さえ受け付けません。鳴り止むと普通に戻ります。
対処方法を教えて下さい。他の関数で良いのがあればそれも。

現在以下のように使用しています。

Private Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" (ByVal lpszName As String, ByVal hModule As Long, ByVal dwFlags As Long) As Long

 Call PlaySound("C:********.wav ", 0, 0)


Blue  2005-11-08 10:26:29  No: 92499

PlaySoundの第3引数に 0 即ちSND_SYNCを指定すると、
サウンドの再生が完了した後で制御を返します。

なので、
> playsound関数で音を鳴らすと鳴ってる間はキーボードの
> 入力さえ受け付けません。鳴り止むと普通に戻ります。
という動きになります。

非同期で再生場合は、SND_ASYNCを指定します。

Private Const SND_ASYNC = &H1         '  play asynchronously
Private Const SND_SYNC = &H0         '  play synchronously (default)

MSDN
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpmltimd/html/_win32_playsound.asp


たくろー  2005-11-09 08:39:48  No: 92500

なるほど  第3引数を1にすれば非同期になるんですね。
ありがとうございます。

この場合、連続して再生する場合、前の音は消されてしまうのは
仕方ないのでしょうか?  非同期でPLAYSOUNDで呼ばれた音は遅れても
構わないので確実に全て再生したいのですが難しいですか?


Blue  2005-11-09 10:51:57  No: 92501

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpmltimd/html/_win32_playsound.asp
を読んでもらえればわかるとおもうのですが

SND_ASYNC Or SND_NOSTOP
を指定すれば、前のサウンドが流れている場合再生されないようになります。

Private Const SND_NOSTOP = &H10       '  don't stop any currently playing sound

ただし、
> 非同期でPLAYSOUNDで呼ばれた音は遅れても構わない
は、結構面倒そう。遅れてでも再生させるとなると、再生できなかったという情報を持って、
それをタイミングよく再生させないといけないですからね。
(PlaySound関数の戻り値とTimerを使うのかなぁ)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加