调用com接口调整windows系统音量
COM(Component Object Model,组件对象模型)接口是微软公司开发的一种二进制接口标准,用于实现软件组件之间的交互和通信。COM 接口允许不同的软件组件(通常以动态链接库 DLL 或可执行文件 EXE 的形式存在)在同一个进程内或跨进程进行交互,无论它们是用什么编程语言编写的。
实现原理
调整windows系统音量的原理很简单,它主要通过COM接口与Windows系统底层的音频服务进行通信。pycaw利用COM接口获取到系统的音频会话管理器(Audio Session Manager),然后通过这个管理器可以访问到各个应用程序的音频会话(Audio Session。每个音频会话都包含了一系列的属性,其中就包括音量(Volume)属性。通过修改这个属性,pycaw就可以实现对Windows系统音量的调整。
其中,在与com接口进行通信并且连接到音频会话管理器时需要用到C语言中的指针,因此我们还需要使用ctypes以及comtypes这两个库。
获取方式
pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple ctypes
pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple pycaw
pip install -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple comtypes
源代码
from ctypes import cast, POINTER
from comtypes import CLSCTX_ALL
from pycaw.pycaw import AudioUtilities, IAudioEndpointVolume
def set_system_volume(volume_level:float):
"""
设置系统主音量
Args:
volume_level:音量级别,范围为0.0到100.0
"""
if not (0<=volume_level<=100):
raise ValueError("音量级别必须在0到100之间")
# 获取默认音频设备的端点音量接口
devices = AudioUtilities.GetSpeakers()
interface = devices.Activate(
IAudioEndpointVolume._iid_, CLSCTX_ALL, None)
volume = cast(interface, POINTER(IAudioEndpointVolume))
#需要判断是不是静音,倘若是静音需要解除静音,否则计时设置音量成功也还是静音状态
mute=volume.GetMute()
if mute==1:
volume.SetMute(False,None)
# 设置音量
volume.SetMasterVolumeLevelScalar(volume_level/100, None)
print(f"系统音量已设置为{volume_level}%")
set_system_volume(100)
结果
运行代码前静音
运行代码后音量被设置到100