2

目標は、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結果は と同じでGetDisplayNameGetSessionInstanceIdentifierすべて空白です。

なぜこれらの空白と 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);

}
4

1 に答える 1

3

インターフェイスの正しい宣言を持つことで、CoreAudioすべての違いが生まれます...

私はあなたのコードを使用しましたが、CoreAudioNETライブラリのインターフェイス宣言を使用しました。すべてが期待どおりに機能します。 出力

コードは非常に広範囲に及ぶため、ここには貼り付けません。代わりに、次のリンクからダウンロードできます:ソース コード

于 2013-04-25T20:15:02.697 に答える