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

bool     WINAPI     SetVolume( long     dev, long     vol); //设置设备的音量,dev=0主音量,1WAVE     ,2MIDI     ,3     LINE     IN

unsigned     WINAPI     GetVolume( int     dev); //得到设备的音量dev=0主音量,1WAVE     ,2MIDI     ,3     LINE     IN


因此,在设置和显示音量时,我只需要直接调用就行了。另外加入了一个静音的效果。其实很简单,就是把当前音量设置为0就是了。
//显示音量
void controlsoundvolumeDialog::ShowVolume()
{
         //获得当前系统音量
        unsigned int currentVolume=GetVolume(m_decType);
        m_sliderVolume->SetValue(currentVolume);
         //数字化显示音量
        wxString volumeLabelString = wxString::Format(wxT( "%i"),currentVolume);
        m_staticTextVolume->SetLabel(volumeLabelString);

}
//静音模式
void controlsoundvolumeDialog::IsMute( wxCommandEvent& event )
{
         //判断是否选择静音
         if (m_checkBoxMute->GetValue())
        {
                SetVolume(m_decType,0);
        }
         else
        {
                 int volume=m_sliderVolume->GetValue();
                SetVolume(m_decType,volume);
        }
}

//改变音量
void controlsoundvolumeDialog::ChangeSoundVolume( wxScrollEvent& event )
{
         int volume=m_sliderVolume->GetValue();
         //设置音量,
        SetVolume(m_decType,volume);
         //数字化显示音量
        wxString volumeLabelString = wxString::Format(wxT( "%i"),volume);
        m_staticTextVolume->SetLabel(volumeLabelString);
}

最后效果.


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

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

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

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