WinCE系统音量的设置

                //========================================================================
//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.youkuaiyun.com/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);
           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.youkuaiyun.com/jiangjunshow

简介:CETool是一个WinCE的辅助程序,使用C语言和Windows API编写,作了一些特殊处理以同时支持WinCE5和WinCE6,主要实现shell中的功能,提供的各种操作涉及到文件系统、窗口管理、进程管理和流程控制几个方面,通过解析配置文件内容来执行相应的操作,属于一种脚本解析程序。程序有以下特点:1. 程序一般是在原路径执行,比如一开始就放置在\Storage Card\目录下,即打开后就以\Storage Card\为工作目录开始处理各项操作。考虑到在程序运程过程中可能要对程序所在分区(或磁盘)进行格式化(或者是移除SD卡)等操作,故添加了一项“自我复制到内存中运行”的功能,即启动后先检测工作目录是不是在内存虚拟出来根目录"\"下,如果不是则先对自身进行复制再重新加载复制后的可执行文件,以便后续的SD移除、或者格式化等操作。对于配置文件,因为是一开始就读进内存中的,所以无需进行复制。此功能一般都不需要使用,即直接在原来的路径运行即可,如需开始此功能,只需将配置文件的文件名从CETool.ini改为_CETool.ini即可。 2. 程序在一次性加载完配置文件后,接着逐行去解析文件内容,遇到注释行或者是格式不正确的行则跳过该行,配置文件有以下特点: (1)配置文件无大小限制,仅取决于物理内存大小,支持Unicode与ANSI编码的文件格式; (2)配置文件中每行的长度无限制,但某些操作的参数对长度有一定限制,如创建目录时,作为目录名的参数的长度有限制(这是文件系统和API的问题)。 (3)各个操作放置的位置、出现的次数无限制。 (4)每一行中的子操作数量无限制。 (5)具有合理的严格性和纠错处理,每一行中在'='后边非关键字处可随意添加空格、制表符、逗号,不影响正常解析,关键内容可以加上引号(单引号和双引号的区别,将在后述提到),如包含空格的路径、参数等。详细介绍参数特殊说明。 3. 支持相对路径的表示方式。参考特殊说明。 4. 支持从文件读入并作为参数的方式(即配置文件中嵌入其它文件,嵌套层数无限制,一般为临时创建的文件,一些不确定参数可以先保存到临时文件,再用此程序读取)。参考特殊说明。5. 支持VB代码嵌入,方便变量使用、判断、循环(这些还有些问题需要解决,将在CETool v2.0中实现)。 此程序涉及内容: 此程序涉及到一些Windows和C语言的基础知识,包括文件系统、注册表、进程、线程、窗口、事件、消息、进程间与线程间通信、脚本、动态库、递归、回调、多维指针、函数指针、数据结构、加密算法等。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值