ПОЛУЧИТЕ Мастер громкости в Windows XP / Vista / Seven (тот, который увеличен через колесо клавиатуры, как правило) - PullRequest
0 голосов
/ 07 января 2011

Я знаю, что многие люди спрашивали об этом, но я не читал ни одного ответа, есть ли какой-нибудь lib / универсальный способ получить (не установлен, мне это не нужно) основной объем (объем текущего источник вывода звука, а не голоса), который работает для обоих XP / Vista / Seven?

Если нет, то как это сделать для xp, vista, seven (я напишу свою универсальную оболочку)

Мне нужно показать полосу (индикатор выполнения), чтобы показать, как устанавливается текущая громкость (элемент управления winform)

Edit:

Я нашел полезную ссылку, я проверяю ее, но я не буду проверять ответ, пока не получу что-то, что работает 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 Ответ

1 голос
/ 07 января 2011

Помогает ли mixerGetNumDevs и соответствующий API?(Вы должны просмотреть все устройства с mixerGetLineControls и т. Д. И посмотреть, какой MIXERCONTROL говорит «Громкость» для имени; также есть способ проверить флаг. Это то, что вы ищете.)


Редактировать:

Вот фрагмент моего старого кода;Я не думаю, что он компилируется, и это не очень хороший код (мне просто нужно было что-то сделать), но это должно быть полезно:

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)
                    {
                    }
                }
            }
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...