目標是使可以播放Flash視頻的WebBrowser控件靜音。所以我發現這個代碼非常有用:https://stackoverflow.com/a/14322736/990618IAudioSessionControl2麻煩WebBrowser控件
問題是一些枚舉是空值,當你期望從GetDisplayName
得到某種編號時,我會得到3-4個空格和2個可以像「 Mozilla Firefox「和"@%SystemRoot%\System32\AudioSrv.Dll,-202"
這是系統聲音。
因此,繼續嘗試GetProcessId,GetSessionIdentifier和GetSessionInstanceIdentifier。
GetProcessId
只會返回零和GetSessionIdentifier
與GetDisplayName
,GetSessionInstanceIdentifier
相同的結果全爲空白。
爲什麼這些空白和零和那些?
這裏的修改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);
}
非常感謝!完美的作品! GetWindowThreadProcessId和GetProcessId一起工作,最後!非常感激! – 2013-04-26 02:15:08