WinCE系统音量的设置 收藏

原创   

<script type="text/javascript"> document.body.oncopy = function() { if (window.clipboardData) { setTimeout(function() { var text = clipboardData.getData("text"); if (text && text.length>300) { text = text + "/r/n/n本文来自CSDN博客,转载请标明出处:" + location.href; clipboardData.setData("text", text); } }, 100); } } </script> <script type="text/javascript">function StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection():'');void(keyit=window.open('http://www.365key.com/storeit.aspx?t='+escape(d.title)+'&u='+escape(d.location.href)+'&c='+escape(t),'keyit','scrollbars=no,width=475,height=575,left=75,top=20,status=no,resizable=yes'));keyit.focus();}</script> //========================================================================
//TITLE:
//    WinCE系统音量的设置
//AUTHOR:
//    norains
//DATE:
//    Sunday  8-April-2007
//Environment:
//        EVC4.0 + Standard SDK 4.2
//        EVC4.0 + Standard SDK 5.0
//========================================================================

        首先我们来看一段最简单的改变音量的代码:

 
       DWORD dwVolume  =   0xAAAAAAAA ;
        waveOutSetVolume(
0 ,dwVolume);


       
        waveOutSetVolume()的第一个参数是设备ID,因为需要更改的是整个系统音量,所以在这里直接取0值即可;第二个参数是需要设置的音量数值,范围是从 0x0 ~ 0xFFFFFFFF.
       
        但这个函数的功能却也是非常有限的,也就是说,它只能更改系统的主音量;如果想修改屏幕点击声,则就无能为力.
       
        有些细心的朋友会从"控制面板"的"声音"入手,发现每次在控制面板调节声音,相应的"ControlPanel/Volume"下的键值数值都会变更. 但如果是直接修其下的改注册表,却是无论如何都达不到相应的功能的----因为没有通知系统,注册表已经被修改.
       
        如果需要告知系统,注册表已经修改,并请系统依照修改的数值来更改音量,则需要调用微软一个未公开的函数:AudioUpdateFromRegistry().
       
        这个函数在文档中是无法搜索到,如果需要调用这个函数,可以有两种方法.
       
        一是直接包含"pwinuser.h"文件,然后直接调用.
       
        二是调用coredll.dll库,引出该函数并使用.
       
        这里展示一个调用的例子:

        typedef  void  (WINAPI  * DLL_AUDIOUPDATEFROMREGISTRY)();

        DLL_AUDIOUPDATEFROMREGISTRY Dll_AudioUpdateFromRegistry 
=  NULL; 
        HINSTANCE hCoreDll 
=  LoadLibrary(TEXT( " coredll.dll " )); 
        
if  (hCoreDll) 
        

            Dll_AudioUpdateFromRegistry 
=  (DLL_AUDIOUPDATEFROMREGISTRY)GetProcAddress(hCoreDll, _T( " AudioUpdateFromRegistry " )); 
            
if  (Dll_AudioUpdateFromRegistry) 
            

                (Dll_AudioUpdateFromRegistry)(); 
            }
 


        只要更新了注册表,然后调用该函数,则系统会根据键值来进行相应的调整.
       
        那么现在让我们来看看位于"ControlPanel/Volume"注册表中各键值的意义:
       
        Volume: 系统的主音量,范围是0x0 ~ 0xFFFFFFFF.
       
        Screen: 屏幕敲击声. 当数值为0时即为无声,1为柔和,65538为洪亮

        Key: 键盘敲击声,数值的意义和Screen相同.
       
        Mute: 控制其它静音的选项. 置0x04位为1时允许事件声音,0x02允许应用程序声音,0x01允许警告声.需要注意的是,如果不允许应用程序声音,则警告声位也将被忽略.
       
       
        如果每次更改音量都要改写注册表,调用动态链接库,会显得比较麻烦.为了写代码的便利,在此封装了这个声音的操作:
(注:CReg 请参见此篇文章:http://blog.csdn.net/norains/archive/2007/04/08/1556296.aspx)

        
/ /
//  SysVolume.h: interface for the CSysVolume class.
//
// Version:
//     1.0.0
// Date:
//     2007.04.08
/ /

#ifndef SYSVOLUME_H
#define  SYSVOLUME_H



#include 
" Reg.h "

// -------------------------------------------------------------------------
// Macro define
#define  MIN_VOLUME            0
#define  MAX_VOLUME            0xFFFFFFFF
// -------------------------------------------------------------------------
// Enum value
enum  VolumeModeType
{
    VOL_SOFT,
    VOL_LOUD,
    VOL_MUTE
}
;
// ------------------------------------------------------------------------

class  CSysVolume  
{
public :
    BOOL SetVolumeScreenTap(VolumeModeType volMode);
    BOOL SetVolumeKeyClick(VolumeModeType volMode);
    BOOL EnableSoundNotification(BOOL bEnable);
    BOOL EnableSoundApplication(BOOL bEnable);
    BOOL EnableSoundEvent(BOOL bEnable);
    BOOL SetVolume(DWORD dwVol);
    CSysVolume();
    
virtual   ~ CSysVolume();

protected :
    BOOL Apply();
    CReg m_Reg;
}
;

#endif   // #ifndef SYSVOLUME_H
        

 


/ /        
//  SysVolume.cpp: implementation of the CSysVolume class.
//
/ /

#include 
" stdafx.h "
#include 
" SysVolume.h "


// ======================================================================
// Macro define

// Registry KEY
#define  BASE_KEY                     HKEY_CURRENT_USER
#define  SUB_KEY                        TEXT("ControlPanel/Volume")
#define  VALUE_VOLUME                TEXT("Volume")
#define  VALUE_SCREEN                TEXT("Screen")
#define  VALUE_KEY                    TEXT("key")
#define  VALUE_MUTE                    TEXT("Mute")


// For the screen tap and the key click
#define  VOL_VALUE_MUTE                0
#define  VOL_VALUE_LOUD                65538
#define  VOL_VALUE_SOFT                1


// The bit for sound
#define  BIT_EVENT                    0x4
#define  BIT_APPLICATION                0x2
#define  BIT_NOTIFICATION            0x1
// ======================================================================
/ /
//  Construction/Destruction
/ /

CSysVolume::CSysVolume()
{
    m_Reg.Create(BASE_KEY, SUB_KEY);
}


CSysVolume::
~ CSysVolume()
{

}






// ---------------------------------------------------------------------
// Description:
//     Apply the volume
// ---------------------------------------------------------------------
BOOL CSysVolume::Apply()
{
    typedef 
void  (WINAPI  * DLL_AUDIOUPDATEFROMREGISTRY)();

    DLL_AUDIOUPDATEFROMREGISTRY Dll_AudioUpdateFromRegistry 
=  NULL; 
    HINSTANCE hCoreDll 
=  LoadLibrary(TEXT( " coredll.dll " )); 
    
if  (hCoreDll) 
    

        Dll_AudioUpdateFromRegistry 
=  (DLL_AUDIOUPDATEFROMREGISTRY)GetProcAddress(hCoreDll, _T( " AudioUpdateFromRegistry " )); 
        
if  (Dll_AudioUpdateFromRegistry) 
        

            (Dll_AudioUpdateFromRegistry)(); 
        }
 
        
else
        
{
            
return  FALSE;
        }

        FreeLibrary(hCoreDll); 
    }
 
    
else
    
{
        
return  FALSE;
    }

    
return  TRUE;
}




// ---------------------------------------------------------------------
// Description:
//     Enable the sound for events
// ---------------------------------------------------------------------
BOOL CSysVolume::EnableSoundEvent(BOOL bEnable)
{
    
if (m_Reg.IsOK()  !=  TRUE)
    
{
        
return  FALSE;
    }

    
    DWORD dwVal 
=  m_Reg.GetValueDW(VALUE_MUTE);

    
if (bEnable  ==  TRUE)
    
{
        dwVal 
|=  BIT_EVENT;
    }

    
else
    
{
        dwVal 
&=   ~ BIT_EVENT;
    }


    m_Reg.SetDW(VALUE_MUTE,dwVal);

    
return  Apply();
}



// ---------------------------------------------------------------------
// Description:
//     Enable the sound for application
// ---------------------------------------------------------------------
BOOL CSysVolume::EnableSoundApplication(BOOL bEnable)
{
    
if (m_Reg.IsOK()  !=  TRUE)
    
{
        
return  FALSE;
    }


    DWORD dwVal 
=  m_Reg.GetValueDW(VALUE_MUTE);

    
if (bEnable  ==  TRUE)
    
{
        dwVal 
|=  BIT_APPLICATION;
    }

    
else
    
{
        dwVal 
&=   ~ BIT_APPLICATION;
    }


    m_Reg.SetDW(VALUE_MUTE,dwVal);

    
return  Apply();
}



// ---------------------------------------------------------------------
// Description:
//     Enable the sound for notifications. If the sound of application is
// mute, the sound of  notification is mute too.
// ---------------------------------------------------------------------
BOOL CSysVolume::EnableSoundNotification(BOOL bEnable)
{
    
if (m_Reg.IsOK()  !=  TRUE)
    
{
        
return  FALSE;
    }


    DWORD dwVal 
=  m_Reg.GetValueDW(VALUE_MUTE);

    
if (bEnable  ==  TRUE)
    
{
        dwVal 
|=  BIT_NOTIFICATION;
    }

    
else
    
{
        dwVal 
&=   ~ BIT_NOTIFICATION;
    }


    m_Reg.SetDW(VALUE_MUTE,dwVal);

    
return  Apply();
}



// ---------------------------------------------------------------------
// Description:
//     Set the key click volume
// ---------------------------------------------------------------------
BOOL CSysVolume::SetVolumeKeyClick(VolumeModeType volMode)
{

    DWORD dwVol 
=   0 ;

    
switch (volMode)
    
{
        
case  VOL_SOFT:
            dwVol 
=  VOL_VALUE_SOFT;
            
break ;
        
case  VOL_LOUD:
            dwVol 
=  VOL_VALUE_LOUD;
            
break ;
        
case  VOL_MUTE:
            dwVol 
=  VOL_VALUE_MUTE;
            
break ;
    }

    
    
if (m_Reg.IsOK()  !=  TRUE)
    
{
        
return  FALSE;
    }

    m_Reg.SetDW(VALUE_KEY,dwVol);
    
    
return  Apply();
}



// ---------------------------------------------------------------------
// Description:
//     Set the screen tap volume
// ---------------------------------------------------------------------
BOOL CSysVolume::SetVolumeScreenTap(VolumeModeType volMode)
{    
    DWORD dwVol 
=   0 ;

    
switch (volMode)
    
{
        
case  VOL_SOFT:
            dwVol 
=  VOL_VALUE_SOFT;
            
break ;
        
case  VOL_LOUD:
            dwVol 
=  VOL_VALUE_LOUD;
            
break ;
        
case  VOL_MUTE:
            dwVol 
=  VOL_VALUE_MUTE;
            
break ;
    }


    
if (m_Reg.IsOK()  !=  TRUE)
    
{
        
return  FALSE;
    }

    m_Reg.SetDW(VALUE_SCREEN,dwVol);
    
return  Apply();
}



// ---------------------------------------------------------------------
// Description:
//     Set the volume. 
//
// Parameters:
//     dwVol: The volume to set. And the range is MIN_VOLUME ~  MAX_VOLUME
// ---------------------------------------------------------------------
BOOL CSysVolume::SetVolume(DWORD dwVol)
{
    
if (dwVol  <  MIN_VOLUME  ||  dwVol  >  MAX_VOLUME)
    
{
        
return  FALSE;
    }

    m_Reg.SetDW(VALUE_VOLUME,dwVol);
    
return  Apply();
}


        由于CSysVolume类将复杂的操作封装在内部,因此设置音量的非常简单.
       
        以更改屏幕敲击声为洪亮为例:

        CSysVolume sysVol;
        sysVol.SetVolumeScreenTap(VOL_LOUD);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值