目標は、Flash ビデオを再生できる WebBrowser コントロールをミュートすることでした。だから私は非常に便利なこのコードを見つけました: https://stackoverflow.com/a/14322736/990618
問題は、列挙型の一部が から何らかの ID を期待するときに null になることです。3 GetDisplayName
~ 4 個の空白と、「Mozilla Firefox」のように問題のない 2 個の"@%SystemRoot%\System32\AudioSrv.Dll,-202"
システム サウンドが得られます。
そこで、GetProcessId、GetSessionIdentifier、および GetSessionInstanceIdentifier を試してみました。
GetProcessId
は 0 と 1 のみを返します。GetSessionIdentifier
結果は と同じでGetDisplayName
、GetSessionInstanceIdentifier
すべて空白です。
なぜこれらの空白と 0 と 1 なのか?
変更されたものは次のEnumerateApplications
とおりです。
public static IEnumerable<string> EnumerateApplications()
{
// get the speakers (1st render + multimedia) device
IMMDeviceEnumerator deviceEnumerator = (IMMDeviceEnumerator)(new MMDeviceEnumerator());
IMMDevice speakers;
deviceEnumerator.GetDefaultAudioEndpoint(EDataFlow.eRender, ERole.eMultimedia, out speakers);
// activate the session manager. we need the enumerator
Guid IID_IAudioSessionManager2 = typeof(IAudioSessionManager2).GUID;
object o;
speakers.Activate(ref IID_IAudioSessionManager2, 0, IntPtr.Zero, out o);
IAudioSessionManager2 mgr = (IAudioSessionManager2)o;
// enumerate sessions for on this device
IAudioSessionEnumerator sessionEnumerator;
mgr.GetSessionEnumerator(out sessionEnumerator);
int count;
sessionEnumerator.GetCount(out count);
for (int i = 0; i < count; i++)
{
IAudioSessionControl ctl;
IAudioSessionControl2 ctl2;
sessionEnumerator.GetSession(i, out ctl);
ctl2 = ctl as IAudioSessionControl2;
string dn;
UInt32 pid = 0;
string sout = "";
if (ctl2 != null)
ctl2.GetSessionIdentifier(out sout);
//ctl.GetDisplayName(out dn);
// ctl2.GetProcessId(out pid);
//yield return pid.ToString();
yield return sout;
if (ctl != null)
Marshal.ReleaseComObject(ctl);
if (ctl2 != null)
Marshal.ReleaseComObject(ctl2);
}
Marshal.ReleaseComObject(sessionEnumerator);
Marshal.ReleaseComObject(mgr);
Marshal.ReleaseComObject(speakers);
Marshal.ReleaseComObject(deviceEnumerator);
}
[Guid("bfb7ff88-7239-4fc9-8fa2-07c950be9c6d"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IAudioSessionControl2
{
[PreserveSig]
int GetProcessId([Out] [MarshalAs(UnmanagedType.U4)] out UInt32 processId);
[PreserveSig]
int GetSessionIdentifier([Out] [MarshalAs(UnmanagedType.LPWStr)] out string pRetVal);
[PreserveSig]
int GetSessionInstanceIdentifier([Out] [MarshalAs(UnmanagedType.LPWStr)] out string pRetVal);
}