2010-02-27 85 views

回答

3

音頻堆棧在Vista中進行了重大改寫。每應用程序音量和靜音控制確實是新功能之一。奇怪的電話將需要使用IAudioEndpointVolume interface

+0

你能給出一個上述問題的工作示例嗎?有什麼辦法可以放棄COM,並用純C或C++編寫代碼? – 2010-02-27 23:02:53

+1

如果你以前從未寫過任何COM代碼,那麼你過着幸福的生活。沒有辦法繞過它。您可以從設計界面的人那裏獲得代碼示例。鏈接:http://blogs.msdn.com/larryosterman/archive/2007/03/06/how-do-i-change-the-master-volume-in-windows-vista.aspx – 2010-02-27 23:37:53

0

我最近處理了這個問題。我們有一個使用聲音系統進行報警的Windows應用程序。我們無法遵守用戶無意中將音響系統靜音。以下是我如何使用上面提出的接口來解決此問題:

在初始化過程中,我添加了一個函數來初始化IAudioEndpointVolume類型的成員。這有點棘手,幫助並不像它可能的那樣有幫助。以下是如何做到這一點:

/**************************************************************************** 
** Initialize the Audio Endpoint (Only for post XP systems) 
****************************************************************************/ 
void CMuteWatchdog::InitAudioEndPoint(void) 
{ 
    HRESULT hr; 
    IMMDeviceEnumerator * pDevEnum; 
    IMMDevice * pDev; 

    const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator); 
    const IID IID_IMMDeviceEnumerator = __uuidof(IMMDeviceEnumerator); 

    hr = CoCreateInstance(CLSID_MMDeviceEnumerator, NULL, 
     CLSCTX_ALL, IID_IMMDeviceEnumerator, 
     (void**)&pDevEnum); 

    m_pIaudEndPt = NULL; 

    if(hr == S_OK) 
    { 
     hr = pDevEnum->GetDefaultAudioEndpoint(eRender, eConsole, &pDev); 
     if(hr == S_OK) 
     { 
     DWORD dwClsCtx; 
     const IID iidAEV = __uuidof(IAudioEndpointVolume); 

     dwClsCtx = 0; 

     hr = pDev->Activate(iidAEV, dwClsCtx, NULL, (void**) &m_pIaudEndPt); 

     if(hr == S_OK) 
     { 
      // Everything is groovy. 
     } 
     else 
     { 
      m_pIaudEndPt = NULL; // Might mean it's running on XP or something. Don't use. 
     } 

     pDev->Release(); 
     } 
     pDevEnum->Release(); 
    } 
} 

...

約每秒一次我添加了一個簡單的調用如下:

//////////////////////////////////////////////////////////////////////// 
// Watchdog function for mute. 
void CMuteWatchdog::GuardMute(void) 
{ 
    if(m_pIaudEndPt) 
    { 
     BOOL bMute; 
     HRESULT hr; 

     bMute = FALSE; 

     hr = m_pIaudEndPt->GetMute(&bMute); 

     if(hr == S_OK) 
     { 
     if(bMute) 
     { 
      m_pIaudEndPt->SetMute(FALSE, NULL); 
     } 
     } 
    } 
} 

最後,當程序退出時只記得釋放分配的資源。

//////////////////////////////////////////////////////////////////////// 
// De-initialize the watchdog 
void CMuteWatchdog::OnClose(void) 
{ 
    if(m_pIaudEndPt) 
    { 
     m_pIaudEndPt->Release(); 
     m_pIaudEndPt = NULL; 
    } 
} 
相關問題