6

私は音のあるアプリケーションを持っています。サウンドをミュートするグローバル プロパティがあります。問題は、音を出すことができるものは非常にたくさんあるということです。私は、さまざまなクラス タイプを反復処理して、それらの音をミュート/ミュート解除することを嫌います。代わりに、グローバル アプリケーション レベルでサウンドをミュートする方法を探しています。システムボリューム全体をミュートするという意味でもありません。

1 つのシナリオ: Windows 7 では、音量ミキサーを開いて個々のアプリケーションの音量を調整できます。この実際の特定の値を変更するつもりはありませんが (Windows 7 固有であることはわかっているため)、アプリケーション内のすべてのボリュームを一度に変更したいと考えています。また、アプリケーション内のすべての音を完全にミュートする機能も必要です。Windows XP 以降と互換性を持たせるには、この機能が必要です。Windows API 呼び出しが含まれると想定していますが、どの呼び出しを行うべきかわかりません。

4

2 に答える 2

4

XPは、アプリケーションごとのボリューム制御をサポートしていません。その機能はVistaで追加されました。したがって、あなたがやろうとしていることは、XPでは公正な手段で行うことはできません。

アプリごとのボリュームコントロールをXPにレトロフィットするIndieVolumeと呼ばれるソフトウェアがあります。低レベルのハッキングやDLLインジェクションなどによってのみそうなると想像できます。それが本当にあなたにとっての選択肢だとは思えません。

于 2012-08-26T08:40:21.883 に答える
3

あなたが求めていることは XP では不可能です。OS は、アプリケーションごとの音量レベルをサポートしていません。

SoundActive: Booleanのようなものを保持する設定クラスを作成することで、必要なことを達成できますPlaySounds: Boolean。独自のユニットに配置し、そのインスタンスを作成する初期化セクションと、それを解放するファイナライズ セクションを用意します (効果的にグローバル値のコレクションにします)。

これらの設定にアクセスする必要がある各ユニットは、それらを含むユニットを使用し、それに応じて動作を調整します。したがって、子クラスやフォームなど、チェックを追加する必要があるものはすべて、次のようになります。

if CurrentSettings.PlaySounds then
  // Code that makes sounds, plays music, whatever.

設定クラスには、現在の音量レベル (XP ではシステム全体のレベル) を追跡するメソッド、および音量関数を使用して音量を増減するメソッドも含めることができます (MMSystemここや Google を介してそうする例がたくさんあります)。 )。その後、アプリがOnActivateおよびOnDeactivateイベントを使用して、アプリがフォーカスを得たときに音量レベルを設定し、アプリがフォーカスを失ったときに適切な音量に戻すことができます。

Vista 以降では、IAudioEndPointVolume前述のインターフェイスと、GetMasterVolumeLevelまたはSetMasterVolumeLevelメソッドのいずれかを使用して、システム全体のボリューム (適切なインターフェイス定義と共にこれを行う例がありMMDevAPIます) またはデバイス レベルのボリューム (IMMDevioce.Activate適切なデバイスを選択するために使用) を制御できます。最初に、次にパラメータでIAudioEndPointVolume受け取ったデバイス インターフェイスの上記のメソッド)。IMMDevice.ActivateppInterface

個々のアプリケーションでは、アプリケーションのオーディオ セッションのボリューム レベルを制御するおよびのISimpleAudioVolume4 つのメソッドを持つインターフェースを使用し、現在のミュート フラグ値を取得または設定できるようにします。(MS の Larry Osterman は、Vista と Win7 での新しいオーディオ サポートに取り組んだ開発者の 1 人であり、新しい API のオーディオの種類とそれぞれをいつ使用するかについて、彼のブログで素晴らしい出発点の記事を書いています。 )GetMasterVolumeSetMasterVolumeGetMuteSetMute

MMSystem使用しているオペレーティング システムを実行時に判断し、XP 以前の機能と Vista 以降の機能をプログラムで切り替えることは、概念的には可能MMDevAPIです。ただし、そのためのコードを誰かが提供してくれると期待するのは少し無理が​​あります。私が提供したリンクは、あなたが正しい道を歩み始めるのに役立つはずであり、途中で障害に遭遇した場合、それらの障害を解決するための具体的なヘルプは素晴らしい質問になるでしょう.

于 2012-11-02T13:01:24.450 に答える