2013-04-22 103 views
1

目標是使可以播放Flash視頻的WebBrowser控件靜音。所以我發現這個代碼非常有用:https://stackoverflow.com/a/14322736/990618IAudioSessionControl2麻煩WebBrowser控件

問題是一些枚舉是空值,當你期望從GetDisplayName得到某種編號時,我會得到3-4個空格和2個可以像「 Mozilla Firefox「和"@%SystemRoot%\System32\AudioSrv.Dll,-202"這是系統聲音。

因此,繼續嘗試GetProcessId,GetSessionIdentifier和GetSessionInstanceIdentifier。

GetProcessId只會返回零和GetSessionIdentifierGetDisplayName,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); 

} 

回答

2

擁有的CoreAudio接口正確的聲明讓一切變得不同......

我用你的代碼,但是從CoreAudioNET庫中使用的接口聲明,一切按預期工作: output

由於代碼是相當廣泛的我不會粘貼在這裏,而是你可以從此鏈接下載:Source Code

+0

非常感謝!完美的作品! GetWindowThreadProcessId和GetProcessId一起工作,最後!非常感激! – 2013-04-26 02:15:08