Programmatically changing system-wide speaker balance on Windows 7

前端 未结 1 1038
孤街浪徒
孤街浪徒 2020-12-19 02:55

How can I programmatically change system-wide speaker balance on Windows 7?

(I can only program in Python and AHK.)

相关标签:
1条回答
  • 2020-12-19 03:52

    Shortcut(created by @AndreMiras) --> use Pycaw , usage of Pycaw can be find here

    Detailed way -- > First install python package Comtypes either by

    1. using pip install comtypes

      or

    2. download from https://pypi.python.org/pypi/comtypes and then extract the download folder. Find setup.py in extracted folder . Open cmd go to the path of setup.py and then run the command python setup.py install

    Now just run the code.py file and you can adjust the volume by changing the first argument of function SetMasterVolumeLevel(-25, None) the first argument must be in between -65 to 0. I have tried this code in windows 8 hopefully it will work on windows 7.

    See at the last lines of code to find the volume.SetMasterVolumeLevel(-25, None) and to adust the volume of PC

    Code.py

    from comtypes import *
    import comtypes.client
    from ctypes import POINTER
    from ctypes.wintypes import DWORD, BOOL
    
    MMDeviceApiLib = \
        GUID('{2FDAAFA3-7523-4F66-9957-9D5E7FE698F6}')
    IID_IMMDevice = \
        GUID('{D666063F-1587-4E43-81F1-B948E807363F}')
    IID_IMMDeviceEnumerator = \
        GUID('{A95664D2-9614-4F35-A746-DE8DB63617E6}')
    CLSID_MMDeviceEnumerator = \
        GUID('{BCDE0395-E52F-467C-8E3D-C4579291692E}')
    IID_IMMDeviceCollection = \
        GUID('{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}')
    IID_IAudioEndpointVolume = \
        GUID('{5CDF2C82-841E-4546-9722-0CF74078229A}')
    
    class IMMDeviceCollection(IUnknown):
        _iid_ = GUID('{0BD7A1BE-7A1A-44DB-8397-CC5392387B5E}')
        pass
    
    class IAudioEndpointVolume(IUnknown):
        _iid_ = GUID('{5CDF2C82-841E-4546-9722-0CF74078229A}')
        _methods_ = [
            STDMETHOD(HRESULT, 'RegisterControlChangeNotify', []),
            STDMETHOD(HRESULT, 'UnregisterControlChangeNotify', []),
            STDMETHOD(HRESULT, 'GetChannelCount', []),
            COMMETHOD([], HRESULT, 'SetMasterVolumeLevel',
                (['in'], c_float, 'fLevelDB'),
                (['in'], POINTER(GUID), 'pguidEventContext')
            ),
            COMMETHOD([], HRESULT, 'SetMasterVolumeLevelScalar',
                (['in'], c_float, 'fLevelDB'),
                (['in'], POINTER(GUID), 'pguidEventContext')
            ),
            COMMETHOD([], HRESULT, 'GetMasterVolumeLevel',
                (['out','retval'], POINTER(c_float), 'pfLevelDB')
            ),
            COMMETHOD([], HRESULT, 'GetMasterVolumeLevelScalar',
                (['out','retval'], POINTER(c_float), 'pfLevelDB')
            ),
            COMMETHOD([], HRESULT, 'SetChannelVolumeLevel',
                (['in'], DWORD, 'nChannel'),
                (['in'], c_float, 'fLevelDB'),
                (['in'], POINTER(GUID), 'pguidEventContext')
            ),
            COMMETHOD([], HRESULT, 'SetChannelVolumeLevelScalar',
                (['in'], DWORD, 'nChannel'),
                (['in'], c_float, 'fLevelDB'),
                (['in'], POINTER(GUID), 'pguidEventContext')
            ),
            COMMETHOD([], HRESULT, 'GetChannelVolumeLevel',
                (['in'], DWORD, 'nChannel'),
                (['out','retval'], POINTER(c_float), 'pfLevelDB')
            ),
            COMMETHOD([], HRESULT, 'GetChannelVolumeLevelScalar',
                (['in'], DWORD, 'nChannel'),
                (['out','retval'], POINTER(c_float), 'pfLevelDB')
            ),
            COMMETHOD([], HRESULT, 'SetMute',
                (['in'], BOOL, 'bMute'),
                (['in'], POINTER(GUID), 'pguidEventContext')
            ),
            COMMETHOD([], HRESULT, 'GetMute',
                (['out','retval'], POINTER(BOOL), 'pbMute')
            ),
            COMMETHOD([], HRESULT, 'GetVolumeStepInfo',
                (['out','retval'], POINTER(c_float), 'pnStep'),
                (['out','retval'], POINTER(c_float), 'pnStepCount'),
            ),
            COMMETHOD([], HRESULT, 'VolumeStepUp',
                (['in'], POINTER(GUID), 'pguidEventContext')
            ),
            COMMETHOD([], HRESULT, 'VolumeStepDown',
                (['in'], POINTER(GUID), 'pguidEventContext')
            ),
            COMMETHOD([], HRESULT, 'QueryHardwareSupport',
                (['out','retval'], POINTER(DWORD), 'pdwHardwareSupportMask')
            ),
            COMMETHOD([], HRESULT, 'GetVolumeRange',
                (['out','retval'], POINTER(c_float), 'pfMin'),
                (['out','retval'], POINTER(c_float), 'pfMax'),
                (['out','retval'], POINTER(c_float), 'pfIncr')
            ),
    
        ]
    
    class IMMDevice(IUnknown):
        _iid_ = GUID('{D666063F-1587-4E43-81F1-B948E807363F}')
        _methods_ = [
            COMMETHOD([], HRESULT, 'Activate',
                (['in'], POINTER(GUID), 'iid'),
                (['in'], DWORD, 'dwClsCtx'),
                (['in'], POINTER(DWORD), 'pActivationParans'),
                (['out','retval'], POINTER(POINTER(IAudioEndpointVolume)), 'ppInterface')
            ),
            STDMETHOD(HRESULT, 'OpenPropertyStore', []),
            STDMETHOD(HRESULT, 'GetId', []),
            STDMETHOD(HRESULT, 'GetState', [])
        ]
        pass
    
    class IMMDeviceEnumerator(comtypes.IUnknown):
        _iid_ = GUID('{A95664D2-9614-4F35-A746-DE8DB63617E6}')
    
        _methods_ = [
            COMMETHOD([], HRESULT, 'EnumAudioEndpoints',
                (['in'], DWORD, 'dataFlow'),
                (['in'], DWORD, 'dwStateMask'),
                (['out','retval'], POINTER(POINTER(IMMDeviceCollection)), 'ppDevices')
            ),
            COMMETHOD([], HRESULT, 'GetDefaultAudioEndpoint',
                (['in'], DWORD, 'dataFlow'),
                (['in'], DWORD, 'role'),
                (['out','retval'], POINTER(POINTER(IMMDevice)), 'ppDevices')
            )
        ]
    
    
    
    
    
    enumerator = comtypes.CoCreateInstance( 
        CLSID_MMDeviceEnumerator,
        IMMDeviceEnumerator,
        comtypes.CLSCTX_INPROC_SERVER
    )
    
    print enumerator
    endpoint = enumerator.GetDefaultAudioEndpoint( 0, 1 )
    print endpoint
    volume = endpoint.Activate( IID_IAudioEndpointVolume, comtypes.CLSCTX_INPROC_SERVER, None )
    print volume
    print volume.GetMasterVolumeLevel()
    print volume.GetVolumeRange()
    #volume.SetMasterVolumeLevel(-65, None) uncomment for 0 volume
    #volume.SetMasterVolumeLevel(-1, None) uncomment for full volume
    volume.SetMasterVolumeLevel(-25, None) #Change the first argument for controlling the volume remember it should be -ve not less than -65
    
    0 讨论(0)
提交回复
热议问题