Windows10でシステム音が邪魔をする

解決


studio-take  2016-09-22 07:40:45  No: 48337

音がポイントのアプリケーションを作ったのですが、PlaySoundでWAVE音を鳴らしているのが、Windows10のシステム音?が邪魔をします。
フォームを切り替えた際の「テロン♪」って音とかを消したいのですが、
どうしたらいいでしょうか?
サウンド設定で「Windows標準」を「なし」したりしてもうまくいきません。
Delphiあんまり関係ないですけど、よろしくお願いします。


igy  2016-09-22 09:51:49  No: 48338

> フォームを切り替えた際の「テロン♪」って音とか

これ、再現できないのですが、
具体的には、どのような操作をしたら、この音が出せますか?


studio-take  2016-10-08 21:13:06  No: 48339

レスを放置して申し訳ございません。
本業が忙しくて対応できませんでした。

どうも、こちらが指定したWAVファイルが、PlaySoundが開けずに警告音を出しているようでした。

ただ、アプリ内で音を設定するためのボタンにもPlaySoundを仕込んで、ファイルパスを参照した際に鳴らしているのですが、それはすべて鳴ります。

また、作業の一部では、指定された音が鳴ります。
条件により鳴ったり鳴らないというのが不可解で、現在調査中です。

ちなみに作業内容は、TEditにバーコードリーダーで文字列を読み込んで
データベースで照合できたらピコン♪。あわなければビー♪
って鳴らしています。

作業環境は、Windows10Home64bit
開発は、WindowsXP + Delphi7ent

Windows7pro 32bitでは、快調に鳴ってくれています。


studio-take  2016-10-08 21:15:15  No: 48340

ちなみに命令は、

PlaySound(PChar(String変数),0,SND_FILENAME or SND_ASYNC);

です。


KON  2016-10-09 03:44:23  No: 48341

こんばんは!KONです。

その「テロン♪」という音は、
システム音のメッセージ(情報)(Windows エラー.wav)でしょうか?
不思議な現象ですね(汗
PlaySound文で確実に鳴っているのでしょうか?

PlaySound( PChar( String変数 ), 0, SND_FILENAME or SND_ASYNC or SND_NODEFAULT );

と、してみてはどうでしょう?
SND_NODEFAULTは、ファイルパスが見つからない場合等にシステム音が鳴るのを抑制します。
それでいけたとしても、根本的な解決にはなっていないですが(汗


studio-take  2016-10-09 04:12:59  No: 48342

PlaySoundのAPIを眺めていましたが、全然分からなかったのですが、
Windowsフォルダのシステム音が入っているmediaフォルダにアプリの音をコピーして参照したら鳴りました。

コーディングで乗り切ってないので消化不良ですが、急ぎの仕事だったので
これで乗り切ります。
苦手なリソース系の問題なのかなぁ?

とにかくお騒がせしました。


KON  2016-10-09 05:43:48  No: 48343

[解決]済みですが、

> Windowsフォルダのシステム音が入っているmediaフォルダにアプリの音をコピーして参照したら鳴りました。 

この文章が気になりましたので…。

wavファイルが置かれている場所如何によって、そのような事象が発生するのでしたら、
アプリケーションのexeファイル内にリソースとして埋め込んでみてはいかがでしょう?
※ 埋め込みを行った場合、wavファイルがオリジナルではない時、
   wavファイルがバイナリに含まれてしまう為、配布などの時はご注意下さい。

★★★ 手動で行う場合 ★★★

(1) リソースファイルを作る
    ファイル名を任意の文字列+rc拡張子( 例:Resource.rc ) にする。
    HOGEHOGE WAVE "C:\Users\******\Desktop\HogeHoge.wav"
    ※ リソース識別子 と WAVE文字列、ファイルパスは1文字以上の空白を空ける。
       ファイルパスは"ダブルクオーテーションで括った方が確実。

(2) 作ったリソースファイルをDelphiのbinディレクトリに置く。
    C:\Program Files (x86)\Embarcadero\Studio\****\bin

(3) コマンドプロンプトを管理者権限で立ち上げ brcc32.exe を実行する。
    brcc32 Resource.rc [Enter]

(4) Resource.resファイルが出来るので、プロジェクトファイルがある自分の場所にコピーする。
    ※ これら一連の入力・実行は、バッチファイル等を作り、一気に行った方が楽です。

【VCLコード】
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, MMSystem;

type
  TForm1 = class( TForm )
    Button1 : TButton;
    procedure Button1Click( Sender : TObject );
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1 : TForm1;

implementation

{$R *.dfm}
{$R Resource.res}   // ← これを追加

procedure TForm1.Button1Click( Sender : TObject );

begin
  PlaySound( 'HOGEHOGE', hInstance, SND_RESOURCE or SND_ASYNC or SND_NODEFAULT );
end;

end.

★★★ Delphiのメニューを利用する場合 ★★★

(1) [メニュー] → [リソースと画像] をクリック。

(2) Project1.dprojのリソースダイアログで [追加] ボタンを押下し、wavファイルを登録。

(3) 追加したwavファイル行を選び、リソース識別子を任意の「文字列」を記述(例:HOGEHOGE)、
    リソースタイプを「WAVE」にする。

(4) Project1.dprojのリソースダイアログのOKボタンを押して閉じる。

【VCLコード】
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, MMSystem;

type
  TForm1 = class( TForm )
    Button1: TButton;
    procedure Button1Click( Sender : TObject );
  private
    { Private 宣言 }
  public
    { Public 宣言 }
  end;

var
  Form1 : TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click( Sender : TObject );

begin
  PlaySound( 'HOGEHOGE', hInstance, SND_RESOURCE or SND_ASYNC or SND_NODEFAULT );
end;

end.


studio-take  2016-10-09 20:15:48  No: 48344

詳しい説明ありがとうございます。

ただ今回は、機種毎に自由に音を変えたいとのクライアントの希望がありまして、こちらで固定の音リソースをつくることはできません。

また、別の機会に上記ソースを参考にさせていてだきます。

ありがとうございました。


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

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






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