GET Windows XP/Vista/Seven 中的主音量(通常通过键盘滚轮增加的那个)
Posted
技术标签:
【中文标题】GET Windows XP/Vista/Seven 中的主音量(通常通过键盘滚轮增加的那个)【英文标题】:GET Master volume in Windows XP/Vista/Seven (the one increased through keyboard wheel normally) 【发布时间】:2011-01-07 20:12:15 【问题描述】:我知道很多人问过这个问题,但我没有读到任何答案,是否有任何 lib/a 通用方式来获取(未设置,我不需要它)主卷(当前的卷xp/vista/seven 的声音输出源,而不是语音)?
如果没有,xp、vista、七怎么办(我会写我的通用包装器)
我需要显示一个栏(进度条)来显示如何设置当前音量(winform 控件)
编辑:
我找到了一个有用的链接,我正在测试它,但我不会检查答案,直到我得到一些有用的东西 http://www.codeproject.com/KB/audio-video/mixerSetControlDetails.aspx?display=Print
编辑 2:
重要的一点:以前分析音量的方法在 windows vista 或更高版本上不起作用,请改用这个库: http://www.codeproject.com/KB/vista/CoreAudio.aspx
我不知道是否真的很好用,因为我目前没有 vista/7
【问题讨论】:
【参考方案1】:mixerGetNumDevs 和相关的 API 有帮助吗? (您必须使用mixerGetLineControls
等浏览所有设备,并查看哪个MIXERCONTROL
为名称显示“音量”;还有一种检查标志的方法。这就是您要寻找的那个。)
编辑:
这是我拥有的一些旧代码的 sn-p;我不认为它可以编译,也不是很好的代码(我只需要完成一些事情),但它应该会有所帮助:
MMRESULT mmResult = mixerOpen(&hMixer, 0, (DWORD_PTR)hWnd, NULL, CALLBACK_WINDOW | MIXER_OBJECTF_MIXER);
if (MMSYSERR_NOERROR == mmResult)
MIXERLINE mxl;
mxl.cbStruct = sizeof(MIXERLINE);
mxl.dwComponentType = MIXERLINE_COMPONENTTYPE_DST_SPEAKERS;
MMRESULT mmResult = mixerGetLineInfo((HMIXEROBJ)hMixer, &mxl, MIXER_OBJECTF_HMIXER | MIXER_GETLINEINFOF_COMPONENTTYPE);
if (mmResult == MMSYSERR_NOERROR)
MIXERLINECONTROLS controls;
memzero(&controls, sizeof(controls));
controls.cbStruct = sizeof(controls);
controls.cControls = 1;
controls.dwLineID = mxl.dwLineID;
controls.cbmxctrl = sizeof(MIXERCONTROL); //one element only!!
MIXERCONTROL controlsArray[2]; //First element: volume, second element: mixer
memzero(&controlsArray, sizeof(controlsArray));
for (int i = 0; i < sizeof(controlsArray) / sizeof(*controlsArray); i++) controlsArray[0].cbStruct = sizeof(controlsArray[0]);
controls.dwControlType = MIXERCONTROL_CONTROLTYPE_VOLUME;
controls.pamxctrl = &controlsArray[0]; //NOTE: this is ZERO
mmResult = mixerGetLineControls((HMIXEROBJ)hMixer, &controls, MIXER_GETLINECONTROLSF_ONEBYTYPE | MIXER_OBJECTF_HMIXER);
if (mmResult == MMSYSERR_NOERROR)
controls.dwControlType = MIXERCONTROL_CONTROLTYPE_MUTE;
controls.pamxctrl = &controlsArray[1]; //NOTE: this is ONE
mmResult = mixerGetLineControls((HMIXEROBJ)hMixer, &controls, MIXER_GETLINECONTROLSF_ONEBYTYPE | MIXER_OBJECTF_HMIXER);
if (mmResult == MMSYSERR_NOERROR)
bool isVolume = controls[0].dwControlID == (DWORD)lParam;
bool isMute = controls[1].dwControlID == (DWORD)lParam;
if (isVolume | isMute)
MIXERCONTROLDETAILS details;
memzero(&details, sizeof(details));
details.cbStruct = sizeof(details);
details.cChannels = 1;
details.dwControlID = (DWORD)lParam;
MIXERCONTROLDETAILS_UNSIGNED controlDetail;
memzero(&controlDetail, sizeof(controlDetail));
details.paDetails = &controlDetail;
details.cbDetails = sizeof(controlDetail);
MMRESULT mmResult = mixerGetControlDetails((HMIXEROBJ)hMixer, &details, MIXER_GETCONTROLDETAILSF_VALUE | MIXER_OBJECTF_HMIXER);
if (mmResult == MMSYSERR_NOERROR)
【讨论】:
我不知道它是否有效(好吧,我是这个论点的新手),它是否也适用于 vista/seven? 我没有尝试过,但我不明白为什么它不会......它没有被弃用或任何东西。 我应该使用 waveOutGetVolume 来获取波形输出设备的音量吗? 我正在阅读它,顺便说一句,我爱你的大代码示例!我需要像你一样“完成工作”,我只想阅读主卷来展示它......我希望它会更容易以上是关于GET Windows XP/Vista/Seven 中的主音量(通常通过键盘滚轮增加的那个)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Get-Service命令提取Windows服务的物理路径
Windows 7 64 位 libsvm 和 python 错误:函数 'svm_get_sv_indices' 未找到