今天遇到一个需求,对于监控电脑的告警声音的控制。为了防止告警声音被人关闭或者关小而发生涉笔故障遗漏事件,笔者作为个有点料的二流工程师,不能就这么放过,也对人肉来完成检查说不。于是乎,Python来完成将电脑告警声音调到最大,然后通过windows的任务计划程序间隔调用python程序或者使用pyinstaller 是一个用来将 Python 程序打包成一个独立可执行软件。
监控电脑一般是windows系统,本文也是在windows下测试的。
最开始笔者是准备使用批处理来完成将告警声音调大最大,但是笔者搜索一圈,发现bat批处理居然没有这个功能。那么笔者就转向万能的Python!
记得笔者以前做过python来锁屏的lock.pyw文件,来跨界操作锁屏电脑。调用user32.dll共享连接库来完成LockWorkStation。于是既然可以锁屏,那么也可以调节声音大小。
#锁屏,相对于win+L
import ctypes as cp
user32 = cp.windll.LoadLibrary('user32.dll')
user32.LockWorkStation()
于是乎,笔者检索测试一番,下面的两个程序都可以步进的调节声音。运行下面的程序,会每次只提高2个点的声音音量,仔细观察的话,同时会出来一个小的调节计。但是距离笔者的需求-调节音量到最大还是有距离的,加个循环来多次调节,那怎么判断已经调到最大呢?时间循环,在这个时间内不断增大,反正跳到最大时再跳也不会有影响,或者每次都增加2个点,反正最后也步进增加到回到100。但是始终觉得有点别扭,因为程序不受控制,这么写的话是个失败。虽然笔者感觉这个win32库可以将声音跳到最大,但是碍于水平有限,无法解决。
然后是各种comtypes、pycaw、win32api(pywin32)库来实现,comtypes库笔者测试成功,但是代码笔者没有看懂,代码也过于复杂,不够pythonic,听说频繁调用会出现valueerror的问题。pycaw笔者未安装测试,pywin32笔者安装失败。
功夫不负有心人!下班后,笔者在github上找到Windows-Sound-Manager ,完美的解决告警声音调节到最大的需求。但是笔者还是要反思,在了解原理后最开始为啥不去github呢?
项目中有三个py文件。此脚本使用内置的windows VK_VOLUME_MUTE、VK_VOLUME_DOWN和VK_VOLUME_UP键模拟击键,这些键用于控制默认音频设置。原理和上面的ctypes一样,底层的keyboard.py其调用的是ctypes.windll.user32.SendInput 。笔者发现项目里面也是不能直接调节到最大值,而是利用其他方法来巧妙的解决了,就是先将音量调到100作为基准,然后根据输入再次调节。
主程序运行如下。首次运行Current volume是0,Increase volume后再次查询变为100 ,然后再以100为基准来进一步调节。
既然计算方法知道了,笔者将项目里面的sound类复制出来,加入到笔者上面的代码中,完成最终的调节到最大音量,当然也可以只保留项目主mian.py中的调节到最大这个功能。笔者为了减少代码量方便封装,糅合了一下来完成,代码 python/volume_level_simple_class.py at main · laufei90/python (github.com) 。
有python环境的平台,那么就可以使用任务计划程序来定时调用这个脚本即可。没有python环境的内部局域网的监控电脑,那么就可以打包成一个独立可执行软件包,Python Tkinter与psutil完成网络速度监视 里面有详细的方法。
pyinstaller -F -w .\volume_level_simple_class.py ,打包成不带控制台的exe文件。
网友评论