Как управлять Windows Master Audio в скрипте Python

отказ от предложения abarnert в Python: изменить главный том Windows 7 < / а>

Я пытаюсь написать скрипт Python для управления основной громкостью в Windows 7

Я понимаю, что в C ++ это можно сделать так:

const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator);
const IID IID_IMMDeviceEnumerator = __uuidof(IMMDeviceEnumerator);
mmde = CoCreateInstance(
    CLSID_MMDeviceEnumerator, NULL,
    CLSCTX_ALL, IID_IMMDeviceEnumerator,
    (void**)&pEnumerator);
mmd = mmde.GetDefaultAudioEndpoint(eRender, eMultimedia);
mgr = mmd.Activate(IID_IAudioSessionManager);
sav = mgr.GetSimpleAudioVolume(None, True);
sav.SetMasterVolume(0.5);

Я пытаюсь получить эту функциональность в python с помощью pywin32, но застрял. Код, который у меня есть до сих пор:

import pythoncom

CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEnumerator)
IID_IMMDeviceEnumerator = __uuidof(IMMDeviceEnumerator)
mmde = pythoncom.CoCreateInstance(CLSID_MMDeviceEnumerator, None, CLSCTX_ALL, IID_IMMDeviceEnumerator)
mmd = mmde.GetDefaultAudioEndpoint(eRender, eMultimedia)
mgr = mmd.Activate(IID_IAudioSessionManager)
sav = mgr.GetSimpleAudioVolume(None, True)
sav.SetMasterVolume(0.5)

CoCreateInstance хочет получить идентификатор класса (CLSID) MMDeviceEnumerator, но, похоже, не имеет какой-либо функции, такой как __uuidof (), для использования для получения идентификатора класса. (Во всяком случае, я не мог найти.)

Есть ли у кого-нибудь идеи / предложения? Я новичок в программировании COM / OLE и pywin32 и чувствую себя немного потерянным.


person Alex Tremblay    schedule 08.09.2015    source источник


Ответы (1)


Из документации

PyIUnknown = CoCreateInstance(clsid, unkOuter , context , iid )

где clsid: идентификатор класса PyIID (CLSID) объекта

Объект PyIID используется всякий раз, когда используется COM GUID. Объекты PyIID могут быть созданы с помощью функции pywintypes.IID (), хотя все функции, которые принимают GUID, также принимают строку в стандартном формате GUID.

PyIID = IID(iidString, is_bytes )

где iidString - строковое представление IID или ProgID.

MMDeviceEnumerator CLSID: BCDE0395-E52F-467C-8E3D-C4579291692E

так попробуйте это

PyIID = IID("BCDE0395-E52F-467C-8E3D-C4579291692E", is_bytes )
person user1    schedule 08.09.2015
comment
Если вы не возражаете, я спрашиваю, как вы нашли CLSID MMDeviceEnumerator? Мне также нужно дать ему IID или GUID интерфейса IMMDeviceEnumerator, но я не могу его найти. Я где-то видел, что интерфейсы IID перечислены в реестре Windows, но не смог найти их там. - person Alex Tremblay; 09.09.2015
comment
Да, они есть в реестре, посмотрите реестр с помощью MMDeviceEnumerator. Здесь вы найдете CLSID HKEY_CLASSES_ROOT \ CLSID \ {BCDE0395-E52F-467C-8E3D-C4579291692E} - person user1; 09.09.2015
comment
@AlexTremblay, если бы этот ответ сработал для вас, не могли бы вы опубликовать рабочий код в качестве второго ответа? Я все еще не могу поместить ответ user1 вместе с вашим кодом в вопрос, чтобы сделать полное решение. Кажется, нужен не только CLSID из MMDeviceEnumerator (который дал user1 вместе с инструкциями по его поиску), но и также IID из IMMDeviceEnumerator, о котором здесь не говорится, и я не могу найти его в моем реестре ... (отказ от ответственности: я не знаю, что означают большинство этих терминов - следую слепо) - person jez; 25.11.2015