【问题标题】:How to control windows master audio in python script如何在 python 脚本中控制 Windows 主音频
【发布时间】:2015-12-03 14:46:11
【问题描述】:

放弃 Python: Change Windows 7 master volume abarnert 的建议

我正在尝试编写一个 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);

我正在尝试使用pywin32 在 python 中获得该功能,但我发现自己陷入了困境。我到目前为止的代码是:

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 想要 MMDeviceEnumerator 的类 ID (CLSID),但似乎没有像 __uuidof() 这样的函数来获取类 ID。 (反正我也找不到。)

有人有什么想法/建议吗?我是 COM/OLE 编程和 pywin32 的新手,感觉有点失落。

【问题讨论】:

    标签: python c++ com pywin32 wasapi


    【解决方案1】:

    来自文档

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

    在哪里 clsid:PyIID 对象的类标识符 (CLSID)

    只要使用 COM GUID,就会使用 PyIID 对象。 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 )
    

    【讨论】:

    • 如果您不介意我的询问,您是如何找到 MMDeviceEnumerator 的 CLSID 的?我还需要给它 IMMDeviceEnumerator 接口的 IID 或 GUID,但我似乎找不到它。我在某处看到接口 IID 列在 Windows 注册表中,但在那里找不到。
    • 是的,在注册表中有,通过“MMDeviceEnumerator”查找注册表。您将在此处找到 CLSID HKEY_CLASSES_ROOT\CLSID\{BCDE0395-E52F-467C-8E3D-C4579291692E}
    • @AlexTremblay 如果此答案对您有用,您介意将工作代码作为第二个答案发布吗?我仍然无法将 user1 的答案与您的代码一起放在问题中以制定完整的解决方案。似乎一个人不仅需要MMDeviceEnumeratorCLSID(用户1 给出的,以及找到它的说明),而且还需要 IMMDeviceEnumeratorIID,这里没有讨论,我也无法在我的注册表中找到它......(免责声明:我不知道这些术语中的大多数是什么意思 - 我盲目地跟随)
    猜你喜欢
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 2013-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多