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 中的主音量(通常通过键盘滚轮增加的那个)的主要内容,如果未能解决你的问题,请参考以下文章

windows之go get报错

powershell AD-GET-Windows的补丁

如何使用Get-Service命令提取Windows服务的物理路径

Windows 7 64 位 libsvm 和 python 错误:函数 'svm_get_sv_indices' 未找到

windows下you-get下载后默认路径在哪里?

Get-WmiObject -Class powershell 命令在 Windows7 中不起作用