最近想做一个情景模式,只是简单的实现三个状态:正常音量,振动,静音。
本来想这么简单的应该不会很难的,开始没有找到相关的函数,就抓取注册表的变化来实现这三个状态。
结果可以实现这三种状态,哈哈,学到几个有用的注册表项。
HKCU\ControlPanel\Notifications\ShellOverrides:Mode. 0表示正常,1表示振动,2是静音
HKCU\ControlPanel\Volume:
_T("Key") //按键音量
_T("Ringer") //这个不清楚
_T("Screen") //应该是点屏幕音量
_T("Volume") // 系统音量
HKCU\ControlPanel\SoundCategories\Ring:InitVol 这个是调节音量那里第二列的音量(0-5)
系统上一状态的音量备份值保存在
HKCU\ControlPanel\Notifications\ShellOverrides:
_T("SavedKey")
_T("SaveRinger")
_T("SavedScreen")
_T("SavedVolume")
还有电话中好像也得设置的,copy snapi.h中的文字
////////////////////////////////////////////////////////////////////////////////
// PhoneRingerOff
// Gets a value indicating whether the phone's ringer is off (i.e., if it rings and/or vibrates).
#define SN_PHONERINGEROFF_ROOTHKEY_LOCAL_MACHINE
#define SN_PHONERINGEROFF_PATHTEXT("System\\State\\Phone")
#define SN_PHONERINGEROFF_VALUETEXT("Status")
#define SN_PHONERINGEROFF_BITMASK0x40
//////////////////////////////////////////////////////////////////////////
设置相应的模式和音量,可以实现相应的功能,但是在TitleBar上面的喇叭图标一直没有改变。。。
这个问题很郁闷,后来网上找到两个文章,可以不用自己维护注册表,而实现上面的问题,
并可以改变上面标题栏的图标~
http://social.msdn.microsoft.com/Forums/zh-TW/803/thread/cb9786c0-823b-4bb1-9f54-12815695ae9c
http://www.devdiv.com/thread-24092-1-1.html
就是使用SndSetSound()函数。
//将顶栏喇叭图标设为(By jjlzg)打开 SNDFILEINFO sndFile1; sndFile1.sstType = SND_SOUNDTYPE_ON; SndSetSound(SND_EVENT_ALL, &sndFile1, TRUE); //将顶栏喇叭图标设为(By jjlzg)震动 SNDFILEINFO sndFile2; sndFile2.sstType = SND_SOUNDTYPE_VIBRATE; SndSetSound(SND_EVENT_ALL, &sndFile2, TRUE);