wince怎么设置声音

wince怎么设置声音,第1张

首先我们来看下,这些声音设置都在注册表: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

3DLL_AUDIOUPDATEFROMREGISTRY Dll_AudioUpdateFromRegistry = NULL

4HINSTANCE hCoreDll = LoadLibrary(TEXT("coredll.dll"))

5if (hCoreDll)

6{

7Dll_AudioUpdateFromRegistry = (DLL_AUDIOUPDATEFROMREGISTRY)GetProcAddress(hCoreDll, _T("AudioUpdateFromRegistry")) 调用该API

8if (Dll_AudioUpdateFromRegistry)

9{

10(Dll_AudioUpdateFromRegistry)()

11}

12else

13{

14return FALSE

15}

16FreeLibrary(hCoreDll)

17}

18else

19{

20return FALSE

21}

22return TRUE

23

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

据我所知好像没有、因为winCE系统是一种嵌入式系统,其设计初衷是为了在有限的资源上最大程度的发挥系统控制、编程、计算、处理等他们的辩轮搏功用,没有太多花里胡哨的东西,它可以像2000/xp一样可以编写程序,你如果够强悍的话可以自己写一些支持声音携祥特性的dll文件,嘿嘿,不过估计可能性为0,一旦改动就桐辩要整个系统要动


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12229318.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-22
下一篇 2023-05-22

发表评论

登录后才能评论

评论列表(0条)

保存