2012-08-25 63 views
6

我有一個有聲音的應用程序。我有一個全球性的財產,以靜音。問題是,有太多不同的東西可以發出聲音,我不願意迭代不同的類類型並將其靜音/取消靜音。相反,我正在尋找一種在全球應用程序級別上靜音的方法。我並不是說要靜音整個系統音量。如何靜音我的應用程序的聲音?

一種情況:在Windows 7中,您可以打開音量混音器並調整各個應用程序的音量。雖然我不打算改變這個實際的特定值(因爲我知道這是特定於Windows 7的),但我想一次性更改應用程序中的所有內容。我還需要能夠將應用程序中的所有內容完全靜音。我需要這種能力與Windows XP及以上版本兼容。我假設它將涉及Windows API調用,但我不知道要調用什麼。

+0

看一看這個問題: http://stackoverflow.com/questions/1092466/windows-xp-mute-unmute-audio-in-programmatically-in-python – Sebi

+3

因爲我記得,XP早已不是按應用程序的聲音級別。你將在你的應用程序中使用一些中央聲音輸出API,如果你讓它出現在Windows API中,或者只是忽略並處置,那麼它會切換。 –

+1

WinXP沒有每個應用程序的聲音控制功能。這是在Vista中添加的,它使用完全獨立的(新)API來添加新的接口來支持它。 Larry Osterman(MS老前輩之一)在他的博客上發表了一系列關於新聲音API的文章;我在這臺機器上沒有鏈接,但你應該可以通過谷歌搜索找到他。在C/C++上有關於SO的文章我記得還有一段時間,我會看看我是否可以找到一個搜索字詞供您使用來查找它們。 –

回答

3

你要求的是不可能在XP上;操作系統根本不支持每個應用程序的音量級別。

您可以通過創建類似於SoundActive: BooleanPlaySounds: Boolean或類似設置的設置類來完成您想要的操作。將它放在它自己的單元中,並有一個初始化部分創建它的一個實例和一個釋放它的實現部分(實際上使其成爲全局值的集合)。

需要訪問這些設置的每個單元只使用包含它們的單位,並相應地調整行爲。因此,每個子類或形式或任何將只需要檢查添加的:

if CurrentSettings.PlaySounds then 
    // Code that makes sounds, plays music, whatever. 

設置類也可以包含跟蹤當前的音量水平(XP系統,全系統級)的方法,以及使用MMSystem音量函數來增加或減少音量的方法(這裏有大量的例子,通過谷歌的例子)。然後,您的應用可以使用OnActivateOnDeactivate事件設置應用獲得焦點時的音量級別,並在應用失去焦點時將其恢復到適當的音量。

在Vista和更高,則可以使用IAudioEndPointVolume接口我前面提到的和無論是GetMasterVolumeLevelSetMasterVolumeLevel方法來控制全系統的體積(我有這樣的一個例子,與適當的MMDevAPI接口定義一起)或設備級卷(使用IMMDevioce.Activate首先選擇適當的設備,然後在ppInterface參數中從IMMDevice.Activate收到設備接口上的IAudioEndPointVolume方法)。

對於單個應用程序,您使用ISimpleAudioVolume接口,它有四種方法:GetMasterVolumeSetMasterVolume,其控制應用程序的音頻對話音量,並GetMuteSetMute允許您檢索當前靜音標誌值或設置它分別。 (MS的拉里奧斯特曼是開發人員,他在Vista和Win7上的新音頻支持工作之一,他的博客上有一個很棒的starting point article關於新API中的音頻類型以及何時使用它們。)

它在概念上可以在運行時確定您正在使用哪種操作系統,並且可以在XP和更早版本之間使用MMSystem功能,以及在Vista和更高版本上使用MMDevAPI功能。然而,期待這裏提供代碼的人有點不合理。我提供的鏈接應該讓你開始走上正確的軌道,當你遇到困難的時候遇到困難時,通過解決這些問題的具體幫助將會是一個很好的問題。

4

XP不支持每個應用程序音量控制。該功能在Vista中添加。所以你試圖做的事情不能以公平的方式在XP中完成。

有一種名爲IndieVolume的軟件,可以將每個應用的音量控制複製到XP。我只能想象它是通過低級黑客攻擊,DLL注入等方式來實現的。我懷疑這對你來說真的是一種選擇。

相關問題