admin 管理员组

文章数量: 1184232

import pyaudio
import numpy as np
import ctypes
import time
import threading
# 音频配置
FORMAT = pyaudio.paFloat32
CHANNELS =1
RATE =44100
CHUNK =1024# 指示灯控制阈值
THRESHOLD =0.001# 音量阈值,根据需要调整灵敏度classScrollLockController:def__init__(self):# 加载用户32.dll库来控制键盘指示灯
        self.user32 = ctypes.WinDLL('user32', use_last_error=True)
        self.last_state =False# 记录上一次的状态,避免频繁切换
        self.running =True# 控制线程运行的标志defset_scrolllock(self, state):"""设置ScrollLock指示灯状态"""if state == self.last_state:return# 如果状态没变,不做任何操作
        self.last_state = state
        # 获取当前键盘状态
        key_state = ctypes.create_string_buffer(256)
        self.user32.GetKeyboardState(ctypes.byref(key_state))# 检查当前ScrollLock状态 - 使用0x91作为ScrollLock的键码
        current_state =(ord(key_state[0x91])&1)!=0# 如果需要改变状态,则模拟按键if current_state != state:# 按下ScrollLock (0x91是ScrollLock的虚拟键码)
            self.user32.keybd_event(0x91,0,0,0)# 释放ScrollLock
            self.user32.keybd_event(0x91,0,0x0002,0)defaudio_monitor(self):"""监听音频并控制指示灯"""# 初始化音频输入
        audio = pyaudio.PyAudio()# 打开音频流
        stream = audio.open(format=FORMAT,
            channels=CHANNELS,
            rate=RATE,input=True,
            frames_per_buffer=CHUNK
        )print("开始监听音频,按Ctrl+C退出...")try:while self.running:# 读取音频数据
                data = stream.read(CHUNK)# 转换为numpy数组
                audio_data = np.frombuffer(data, dtype=np.float32)# 计算音量(RMS值)
                volume = np.sqrt(np.mean(np.square(audio_data)))# 根据音量设置ScrollLock状态if volume > THRESHOLD:
                    self.set_scrolllock(True)else:
                    self.set_scrolllock(False)# 短暂延迟,减少CPU占用
                time.sleep(0.01)except KeyboardInterrupt:print("\n程序正在退出...")finally:# 清理资源
            stream.stop_stream()
            stream.close()
            audio.terminate()# 确保退出时ScrollLock是开启状态
            self.set_scrolllock(True)defstart(self):"""启动监控线程"""
        self.thread = threading.Thread(target=self.audio_monitor)
        self.thread.start()defstop(self):"""停止监控线程"""
        self.running =False
        self.thread.join()if __name__ =="__main__":try:print("注意:运行此程序需要安装pyaudio库")print("如果尚未安装,请先运行:pip install pyaudio numpy\n")
        controller = ScrollLockController()
        controller.start()# 保持主线程运行whileTrue:
            time.sleep(1)except KeyboardInterrupt:
        controller.stop()print("程序已退出")

本文标签: 退出 编程 系统