質問: 作成したアプリケーションだけをミュート、アンミュートしたいのですが、良い方法はないでしょうか。 アプリケーションにはブラウザが含まれており、ブラウザ内のFlashなどもまとめてミュートしたいです。 音声ミキサーのアプリケーション単位のミュート動作が合致します。 一応、Vannatec.CoreAudio.dllを使う方法はありましたが、できれば外部dll無しの方法が今後を考えるとありがたいです。
回答: 具体的に同等の実装を行ったことがないので、基本的にポインター提供のみとなります。 要は Windows の Core Audio API を叩ければいいので、Vannatec.CoreAudio.dll がどういう挙動を取っているかは分かりませんが、おそらくほぼ同等の事を行えば良いかと思います。名前的にも Windows Core Audio API を叩いてるのでしょうし。 という点で言うと、 ......にある が参考になるように思えます。 GetVolumeObject() 内でプロセス列挙して実際の API コールは SetApplicationMute() 辺りで行っている形ですね。 ここで取得している IAudioSessionControl2::GetProcessId() から得られるプロセス ID が (Win32 API 的な) CreateProcess() 的なプロセス ID であれば、単に自身のプロセス ID を指定して mute 操作を行えば大丈夫かと思います。そうでなかったとしても、GetVolumeObject() 内で列挙して取得しているので、その辺りが十分に参考になるかと思います。 ただ、Core Audio になってから「音を鳴らしていないアプリは音量ミキサーの一覧に出てくるのを見たことがない」ので、もしかしたら GetVolumeObject() で行っている ISimpleAudioVolume オブジェクトを直接プロセス ID を指定しても取得できないかもしれないので、もしかしたらその辺りにちょっと工夫がいるかもしれません。 単にシステム音を鳴らす (例えば System.Media.SystemSounds.Asterisk.Play(); で鳴らす) だけのアプリなどは出てきませんので、別途前準備が必要になるかもしれません。