很久没有做一些感兴趣的东西了,今天这个时候加晚班正好有点时间,研究了一下在windows下控制音量。用到了winmm,因为用的是wxWidgets做界面,所以需要在引用里加入libwinmm.a这个静态链接库。同样,如果是基于vc的开发,那么引用winmm.lib就是了。
主要用到了以下两个api提供的函数。

InBlock.gif bool     WINAPI     SetVolume( long     dev, long     vol); //设置设备的音量,dev=0主音量,1WAVE     ,2MIDI     ,3     LINE     IN
InBlock.gif
unsigned     WINAPI     GetVolume( int     dev); //得到设备的音量dev=0主音量,1WAVE     ,2MIDI     ,3     LINE     IN


因此,在设置和显示音量时,我只需要直接调用就行了。另外加入了一个静音的效果。其实很简单,就是把当前音量设置为0就是了。
InBlock.gif //显示音量
InBlock.gif void controlsoundvolumeDialog::ShowVolume()
InBlock.gif{
InBlock.gif         //获得当前系统音量
InBlock.gif        unsigned int currentVolume=GetVolume(m_decType);
InBlock.gif        m_sliderVolume->SetValue(currentVolume);
InBlock.gif         //数字化显示音量
InBlock.gif        wxString volumeLabelString = wxString::Format(wxT( "%i"),currentVolume);
InBlock.gif        m_staticTextVolume->SetLabel(volumeLabelString);
InBlock.gif
}
InBlock.gif //静音模式
InBlock.gif void controlsoundvolumeDialog::IsMute( wxCommandEvent& event )
InBlock.gif{
InBlock.gif         //判断是否选择静音
InBlock.gif         if (m_checkBoxMute->GetValue())
InBlock.gif        {
InBlock.gif                SetVolume(m_decType,0);
InBlock.gif        }
InBlock.gif         else
InBlock.gif        {
InBlock.gif                 int volume=m_sliderVolume->GetValue();
InBlock.gif                SetVolume(m_decType,volume);
InBlock.gif        }
InBlock.gif}
InBlock.gif
//改变音量
InBlock.gif void controlsoundvolumeDialog::ChangeSoundVolume( wxScrollEvent& event )
InBlock.gif{
InBlock.gif         int volume=m_sliderVolume->GetValue();
InBlock.gif         //设置音量,
InBlock.gif        SetVolume(m_decType,volume);
InBlock.gif         //数字化显示音量
InBlock.gif        wxString volumeLabelString = wxString::Format(wxT( "%i"),volume);
InBlock.gif        m_staticTextVolume->SetLabel(volumeLabelString);
InBlock.gif}

最后效果.


另外针对不同的设备类型,显示音量和设置音量自然应该不同,所以应该额外给一个设备类型的标志。
InBlock.gif //改变选择音量类型
InBlock.gif void controlsoundvolumeDialog::ChangeVolumeType( wxCommandEvent& event )
InBlock.gif{
InBlock.gif         int decType=m_choiceVolumeType->GetCurrentSelection();
InBlock.gif         switch (decType)
InBlock.gif        {
InBlock.gif         case 0:
InBlock.gif                m_decType=0;
InBlock.gif                 break;
InBlock.gif         case 1:
InBlock.gif                m_decType=1;
InBlock.gif                 break;
InBlock.gif         case 2:
InBlock.gif                m_decType=2;
InBlock.gif                 break;
InBlock.gif         default:
InBlock.gif                m_decType=0;
InBlock.gif                 break;
InBlock.gif        }
InBlock.gif        ShowVolume();
InBlock.gif}

1: 附件里包括完整的工程文件,源代码,wxFormBuilder所设计的界面文件以及编译之后的可执行文件。因为wxWidgets的动态链接库太大,压 缩之后也有 2.5M,超过上传限制,有需要的可以搜索自行下载一个 基于wxWidgets-2.8.9的库就行了。

2:这个工程所使用的wxWidgets动态链接库名称.
wxmsw28u_gcc_ilcd.dll

3:CodeBlocks+wxWidgets-2.8.9下编译通过