zoukankan      html  css  js  c++  java
  • 『转』对WINCE中各种音量设置一点见解

    转自:http://www.cnblogs.com/walzer/archive/2008/02/20/1074438.html

    作者: liswei

    Walzer声明:此文为我同事所写, 文中参考引用了norains的<WinCE系统音量的设置>一文, 文中的CReg.h则出自微软WINCE500\PUBLIC下的公开代码. 网友若对文中一些技术细节有疑问, 可以移步到norains博客(http://blog.csdn.net/norains/)的相关文章下向norains请教

     

    -----------------
    最近一段时间在修改音量需求变化的时候,让我对在WINCE下对各种音量的设置有了一定的理解,现在将我的理解写到blog上,让各位指教。

    首先我们来看下,这些声音设置都在注册表:HKEY_CURRENT_USER\ControlPanel\Volume下,里面的几个键值都是控制声音的。先解释如下:

    Volume: 系统的主音量,范围是0x0 ~ 0xFFFFFFFF.
            
    Screen: 屏幕敲击声. 当数值为0(或65536)无声,1为柔和,65538为洪亮

    Key: 键盘敲击声,数值的意义和Screen相同.
            
    Mute: 控制其它静音的选项. 置0x04位为1时允许事件声音,0x02允许应用程序声音,0x01允许警告声.需要注意的是,如果不允许应用程序声音,则警告声位也将被忽略.

    知道各个键值的意义后,我从最主要的系统的主音量Volume说起。

    一、对系统主音量Volume的操作

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

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

        
    waveOutSetVolume()的第一个参数是设备ID,因为需要更改的是整个系统音量,所以在这里直接取0值即可;第二个参数是需要设置的音量数值,范围是从 0x0 ~ 0xFFFFFFFF。

    通过waveOutSetVolume()这个API,我们可以很容易的更改系统设备的音量,但这个时候,如果你去查看注册表的Volume的键值是没有变化的,因为它只修改了设备的音量,变化还没有这么快到达注册表。但你可以到“控制面板”中的“音量与声音”打开一下,注册表的值也随之改变。(反之,通过对注册表的单独操作对具体音量是起不到作用的)

    所以,我对音量的操作,首先对注册表中的Volume进行操作,在用waveOutSetVolume()这个API具体改变音量,这样可以达到一致。具体操作代码如下:

    DWORD dwVolume = 0;
    CReg* pVolumeReg = NULL;

     pVolumeReg = new CReg( HKEY_CURRENT_USER, TEXT("ControlPanel\\Volume") );

     dwVolume = pVolumeReg->ValueDW(TEXT("Volume"));
    。。。。。。。。。。。。。。对音量的具体设置

    if( waveOutSetVolume(NULL, dwVolume) != MMSYSERR_NOERROR )           音量设置是否成功
     {
      DBGMSG(ZONE_1, (TEXT("waveOutSetVolume failed, [MainLayere.cpp, SetVolume]")));
     }
     
     pVolumeReg->SetDW(TEXT("Volume"),dwVolume); 设置注册表
     delete pVolumeReg;
     pVolumeReg = NULL;   

     上面用到的CReg是一个对注册表操作的类,是我们小组用的一个基类(Walzer注:在WINCE500目录下搜索CReg可以找到, 其实微软的人也很懒)。这样我们对主音量设置就很完善了。

    二、对硬件按键声音(KEY键值)的设置

           尽管waveOutSetVolume()这个API对主音量设置很好用,但这个函数的功能却也是非常有限的,也就是说,它只能更改系统的主音量;如果想修改硬件按键声音或屏幕敲击声,则就无能为力.
            
            有些比较细心的朋友可能会从"控制面板"的"声音"入手,发现每次在控制面板调节声音,相应的"ControlPanel\Volume"下的键值数值都会变更.但如果是直接修其下的改注册表,却是无论如何都达不到相应的功能的----因为没有通知系统,注册表已经被修改.
            
            如果需要告知系统,注册表已经修改,并请系统依照修改的数值来更改音量,则需要调用微软一个未公开的API:AudioUpdateFromRegistry().
            
            这个API在文档中是无法搜索到,如果需要调用这个函数,可以有两种方法.
            
            一是直接包含"pwinuser.h"文件,然后直接调用.
            
            二是调用coredll.dll库,引出该函数并使用.
            
           第一种方法比较不稳定,因为有一些人的sdk中没有这个pwinuser.h文件,所以程序找不到。我还是推荐用第二种方法,直接调用该API(就象我们组长说的暴力调用API,这个方法真的还是不错的。)

        其具体代码如下: 

     

     1typedef void (WINAPI *DLL_AUDIOUPDATEFROMREGISTRY)();定义一个新类型指针,指向WINAPI
     2
     3    DLL_AUDIOUPDATEFROMREGISTRY Dll_AudioUpdateFromRegistry = NULL; 
     4    HINSTANCE hCoreDll = LoadLibrary(TEXT("coredll.dll")); 
     5    if (hCoreDll) 
     6    
     7        Dll_AudioUpdateFromRegistry = (DLL_AUDIOUPDATEFROMREGISTRY)GetProcAddress(hCoreDll, _T("AudioUpdateFromRegistry"));   调用该API
     8        if (Dll_AudioUpdateFromRegistry) 
     9        
    10            (Dll_AudioUpdateFromRegistry)(); 
    11        }
     
    12        else
    13        {
    14            return FALSE;
    15        }

    16        FreeLibrary(hCoreDll); 
    17    }
     
    18    else
    19    {
    20        return FALSE;
    21    }

    22    return TRUE;
    23

    这样通过修改注册表Key键值,然后通过调用该方法就能实现对按键声音的设置。

    对Screen和Mute的设置也可以用该方法,至此,对WINCE各种音量的设置就基本掌握了。希望能给大家点帮助。


    Walzer评点:
    这篇文章不仅写的是WaveOutSetVolume这个API的使用, 还包括了系统注册表里对应于控制面板音量调节的修改. 并且提到了我们惯用的“暴力调用API”方法。

  • 相关阅读:
    Double 四舍五入保留小数
    QQ在线人数统计图数据解析
    Errors running builder 'Android Resource Manager' on project 'DeskClock'.
    批处理脚本学习笔记——程序猿版
    BZOJ 1002: [FJOI2007]轮状病毒
    《逆袭大学——传给IT学子的正能量》文件夹
    webservice 开发规范
    webservice面试题
    jdbc连接oracle数据库问题
    jdbc连接 orale 和 mysql 所需要的jar包
  • 原文地址:https://www.cnblogs.com/abinxm/p/1732625.html
Copyright © 2011-2022 走看看