【开源工具】Windows屏幕控制大师:息屏+亮度调节+快捷键一体化解决方案

🖥️ 从零打造Windows屏幕控制大师:息屏+亮度调节+快捷键一体化解决方案在这里插入图片描述

请添加图片描述

🌈 个人主页:创客白泽 - CSDN博客
🔥 系列专栏:🐍《Python开源项目实战》
💡 热爱不止于代码,热情源自每一个灵感闪现的夜晚。愿以开源之火,点亮前行之路。
🐋 希望大家多多支持,我们一起进步!
👍 🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏 ⭐️ 加关注+💗分享给更多人哦

请添加图片描述

📜 概述

在数字化办公时代,屏幕管理已成为提升工作效率和保护眼睛健康的重要环节。今天我将分享一个基于Python和PySide6开发的Windows屏幕控制工具,它集成了一键息屏亮度调节自动息屏时间设置全局快捷键等实用功能,并支持系统托盘运行开机自启动

本文将深入解析这个工具的实现原理关键技术点完整代码,适合有一定Python基础的开发者学习GUI开发、系统级操作和实用工具开发。

🎯 功能亮点

  1. 💤 一键息屏功能

    • 立即关闭显示器节省能源
    • 支持全局快捷键触发(可自定义)
  2. ⏱️ 自动息屏时间设置

    • 预设常用时间(1/5/10/15/30/60分钟)
    • 支持自定义任意分钟数
    • 永不息屏模式
  3. ☀️ 屏幕亮度控制

    • 0-100%无级调节
    • 预设常用亮度档位
    • 亮度调节快捷键支持
  4. ⚙️ 实用附加功能

    • 系统托盘运行
    • 开机自启动
    • 启动时最小化
    • 当前设置实时显示

🖼️ 界面展示

主界面设计

在这里插入图片描述

界面采用现代化设计,包含:

  • 醒目的标题区
  • 快速息屏大按钮
  • 自动息屏时间预设区
  • 亮度控制滑块
  • 应用设置面板
  • 当前设置显示区

系统托盘菜单

在这里插入图片描述

🛠️ 实现步骤详解

1. 环境准备

# 主要依赖库
import sys
import ctypes
import subprocess
import winreg
from PySide6.QtWidgets import (QApplication, QMainWindow, ...)
from PySide6.QtCore import Qt, QTimer, QSettings

2. 亮度控制模块

亮度调节采用了三种备选方案,确保兼容性:

class BrightnessController:def set_brightness(self, level):# 方法1: WMI (Windows Management Instrumentation)try:import wmiw = wmi.WMI(namespace='wmi')methods = w.WmiMonitorBrightnessMethods()[0]methods.WmiSetBrightness(level, 0)# 方法2: PowerShell命令except:script = f"$brightness = {level}; $myMonitor = Get-WmiObject..."subprocess.run(["powershell", "-Command", script])# 方法3: DDC/CI控制except:import screen_brightness_control as sbcsbc.set_brightness(level)

3. 息屏功能实现

使用Windows API发送消息关闭显示器:

def turn_off_screen(self):# 0x0112 = WM_SYSCOMMAND, 0xF170 = SC_MONITORPOWER, 2 = 关闭显示器ctypes.windll.user32.SendMessageW(0xFFFF, 0x0112, 0xF170, 2)

4. 息屏时间设置

通过Windows powercfg命令修改电源设置:

def set_screen_timeout(self, minutes):if minutes == 0:  # 永不息屏subprocess.run(['powercfg', '/change', 'monitor-timeout-ac', '0'])else:  # 设置指定时间subprocess.run(['powercfg', '/change', 'monitor-timeout-ac', str(minutes)])

5. 全局快捷键实现

使用QShortcut捕获全局快捷键:

def setup_global_shortcut(self, key_sequence):self.global_shortcut = QShortcut(key_sequence, self)self.global_shortcut.activated.connect(self.turn_off_screen)

6. 开机自启动

通过修改Windows注册表实现:

def toggle_autostart(self, state):key_path = r"SOFTWARE\Microsoft\Windows\CurrentVersion\Run"if state == Qt.Checked:  # 添加启动项winreg.SetValueEx(key, "ScreenController", 0, winreg.REG_SZ, exe_path)else:  # 删除启动项winreg.DeleteValue(key, "ScreenController")

7. 系统托盘集成

创建托盘图标和右键菜单:

def setup_tray_icon(self):self.tray_icon = QSystemTrayIcon(self)tray_menu = QMenu()# 添加菜单项show_action = QAction("显示主窗口", self)screen_off_action = QAction("立即息屏", self)# 亮度子菜单brightness_menu = tray_menu.addMenu("屏幕亮度")for level in [0, 25, 50, 75, 100]:action = QAction(f"{level}%", self)action.triggered.connect(lambda l=level: self.set_brightness_level(l))brightness_menu.addAction(action)

🔍 关键代码解析

1. 多方法亮度控制

亮度控制模块采用了策略模式,依次尝试三种不同的亮度调节方法:

  1. WMI方式:最原生的Windows管理接口
  2. PowerShell方式:兼容性更好的脚本方法
  3. DDC/CI方式:直接与显示器通信

这种设计确保了在各种Windows环境和硬件配置下都能正常工作。

2. 设置持久化

使用QSettings实现配置的自动保存和加载:

# 保存设置
self.settings.setValue("shortcut", self.shortcut_edit.keySequence().toString())# 加载设置
shortcut_string = self.settings.value("shortcut", "", type=str)

3. 管理员权限检测

关键系统操作需要管理员权限:

def is_admin(self):try:return ctypes.windll.shell32.IsUserAnAdmin()except:return False

📥 源码下载

import sys
import ctypes
import subprocess
import os
import sys
import winreg
import argparse
from pathlib import Path
from PySide6.QtWidgets import (QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QGridLayout, QPushButton, QLabel, QLineEdit, QFrame, QMessageBox,QGroupBox, QSpacerItem, QSizePolicy, QCheckBox, QKeySequenceEdit,QSystemTrayIcon, QMenu, QSlider
)
from PySide6.QtCore import Qt, QTimer, QSettings, QStandardPaths
from PySide6.QtGui import QFont, QPalette, QColor, QKeySequence, QShortcut, QIcon, QPixmap, QAction# 获取应用程序路径(支持打包后的可执行文件)
def get_app_path():"""获取应用程序路径,支持打包后的可执行文件"""if getattr(sys, 'frozen', False):return Path(sys.executable).parentelse:return Path(__file__).parent# 获取配置文件路径
def get_config_path():"""获取配置文件路径"""config_dir = QStandardPaths.writableLocation(QStandardPaths.AppConfigLocation)return Path(config_dir) / "ScreenController"class BrightnessController:"""屏幕亮度控制类"""def __init__(self):self.physical_monitors = self._get_physical_monitors()def _get_physical_monitors(self):"""获取物理显示器句柄"""try:from screeninfo import get_monitorsreturn [monitor for monitor in get_monitors() if monitor.is_primary]except Exception as e:print(f"获取显示器信息失败: {e}")return []def set_brightness(self, level):"""设置屏幕亮度(0-100)"""try:if not (0 <= level <= 100):raise ValueError("亮度值必须在0-100之间")# 方法1: 使用WMI (Windows Management Instrumentation)try:import wmiw = wmi.WMI(namespace='wmi')methods = w.WmiMonitorBrightnessMethods()[0]methods.WmiSetBrightness(level, 0)return Trueexcept Exception as wmi_error:# 方法2: 使用PowerShell命令 (适用于更多系统)try:brightness = max(0, min(100, level))script = f"""$brightness = {brightness}$delay = 0$myMonitor = Get-WmiObject -Namespace root\\wmi -Class WmiMonitorBrightnessMethods$myMonitor.WmiSetBrightness($delay, $brightness)"""subprocess.run(["powershell", "-Command", script], check=True, creationflags=subprocess.CREATE_NO_WINDOW)return Trueexcept subprocess.CalledProcessError:# 方法3: 使用DDC/CI (需要显示器支持)try:if self.physical_monitors:import screen_brightness_control as sbcsbc.set_brightness(level)return Trueexcept Exception as sbc_error:raise Exception(f"所有亮度调节方法均失败: WMI错误: {wmi_error}, DDC/CI错误: {sbc_error}")except Exception as e:raise Exception(f"设置亮度失败: {str(e)}")class ScreenController(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("🖥️ Windows屏幕控制")self.setFixedSize(1000, 800)  # 增加窗口尺寸以容纳亮度控制# 亮度控制器self.brightness_controller = BrightnessController()# 设置存储config_path = get_config_path()config_path.mkdir(parents=True, exist_ok=True)settings_file = config_path / "settings.ini"self.settings = QSettings(str(settings_file), QSettings.IniFormat)# 全局快捷键self.global_shortcut = Noneself.brightness_shortcut = None# 系统托盘self.tray_icon = Noneself.setup_tray_icon()self.setup_ui()self.setup_style()self.load_settings()# 定时器用于更新当前设置self.update_timer = QTimer()self.update_timer.timeout.connect(self.update_current_setting)self.update_timer.start(5000)  # 每5秒更新一次# 初始更新self.update_current_setting()def setup_ui(self):"""设置用户界面"""central_widget = QWidget()self.setCentralWidget(central_widget)# 主布局main_layout = QVBoxLayout(central_widget)main_layout.setSpacing(20)main_layout.setContentsMargins(25, 25, 25, 25)# 标题 - 添加emojititle_label = QLabel("🖥️ Windows屏幕控制器")title_font = QFont("Microsoft YaHei", 20, QFont.Bold)title_label.setFont(title_font)title_label.setAlig

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/83933.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/83933.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pyhton基础【11】函数一

目录 一.函数说明 二.函数介绍 函数简介 作用 函数分类 三.自定义函数 定义函数 调用函数 pass关键字 定义一次执行多次 一.函数说明 Python中的函数是一个重要的编程概念&#xff0c;它允许编程者封装代码块以实现特定的功能。函数的作用和应用场景非常广泛&#xf…

使用Kotlin开发后端服务的核心方法

一、开发步骤 选择框架 Kotlin后端开发常用框架包括Spring Boot、Ktor和Micronaut。Spring Boot生态成熟&#xff0c;适合企业级应用&#xff1b;Ktor轻量且协程友好&#xff0c;适合高性能异步服务&#xff1b;Micronaut以低内存占用和快速启动见长。 搭建项目结构 通过Grad…

java面试总结-20250616

题目1: 求一个int类型正整数二进制中最高位1的位置&#xff1f; 比如10&#xff0c;二进制位1010&#xff0c;最高位1所在位置位4。 解体思路&#xff1a; 使用高位扩散&#xff0c;将1010扩散位1111使用二分法&#xff0c;计算32位二进制中1111前面0的位数n&#xff1b;结果…

Black自动格式化工具

文章目录 一、Black自动格式化工具二、格式化行为的核心内容1. 统一缩进和空格规则2. 括号换行&#xff1a;一致的多行结构展开3. 字符串风格统一4. 函数/类定义中的空行规则5. import 排序&#xff08;建议搭配 isort&#xff09;6. 注释不动、换行优雅7. 可配置项极少&#x…

项目拓展-简易SQL监控,P6SPY拦截所有jdbc连接并打印执行SQL

介绍一下P6spy驱动 p6spy 是一款开源的数据库监控框架&#xff0c;主要用于 拦截和记录应用程序与数据库之间的所有交互&#xff08;如 SQL 语句、参数、执行时间等&#xff09; 它通过包装现有的 JDBC 驱动&#xff08;如 MySQL JDBC 驱动&#xff09;&#xff0c;在不修改业…

洛谷B3951 [GESP样题 五级] 小杨的队列

题目描述 小杨的班级里共有 N N N 名同学&#xff0c;学号从 0 0 0 至 N − 1 N-1 N−1。某节课上&#xff0c;老师要求同学们进行列队。具体来说&#xff0c;老师会依次点名 M M M 名同学&#xff0c;让他们加入队伍。每名新入队的同学需要先站到队伍末尾&#xff08;刚开…

Java编程之外观模式

前言 想象你要去一家很复杂的餐厅吃饭&#xff0c;但不想自己点菜、排队、找位置&#xff0c;也不想管厨房、洗碗、送餐这些后端流程。你只需要告诉餐厅服务员“我要一份牛排套餐”&#xff0c;然后坐等就好。这个服务员&#xff0c;就是外观模式&#xff08;Facade Pattern&a…

告别 Java 开发困境!飞算 JavaAI 开发助手开启智能编程新时代

在 Java 开发的世界里&#xff0c;需求不明确、加班写重复代码、被 BUG 搞得焦头烂额&#xff0c;是许多开发者难以摆脱的 “三座大山”。需求文档模糊不清&#xff0c;让开发者在项目起始阶段就陷入迷茫&#xff1b;大量重复性的代码编写工作&#xff0c;不仅消耗时间和精力&a…

Node.js 中两种模块导出方式区别

两种模块到处方式 exports.xxx ... module.exports ... 1. exports.xxx ... exports 是 module.exports 的一个引用&#xff08;快捷方式&#xff09;。 当你写 exports.foo function() {}&#xff0c;实际上就是给 module.exports 对象添加了一个 foo 属性。 这种方式…

电脑出问题了,无网络环境下一键快速重装系统

在电脑使用过程中&#xff0c;系统故障、卡顿、崩溃等问题屡见不鲜。面对这些情况&#xff0c;重装系统往往是解决问题的最有效手段之一。然而对于刚接触计算机操作的新用户来说&#xff0c;如何安全、稳定地完成系统重装&#xff0c;仍是一个颇具挑战的任务。 这一款专为新手…

基于区块链的去中心化身份验证系统:原理、实现与应用

前言 在数字化时代&#xff0c;身份验证是网络安全和隐私保护的核心环节。传统的身份验证系统依赖于中心化的机构&#xff0c;如政府、银行或互联网服务提供商&#xff0c;这些机构存储和管理用户的个人信息。然而&#xff0c;中心化系统存在诸多问题&#xff0c;如数据泄露风险…

React forwardRef 与 useImperativeHandle 深度解析

在React开发中&#xff0c;组件间的通信是一个核心话题。虽然props和state能够处理大部分场景&#xff0c;但有时我们需要更直接的方式来操作子组件。今天我们来深入探讨两个强大的React Hook&#xff1a;forwardRef和useImperativeHandle。 forwardRef&#xff1a;传递引用的…

KingbaseES在线体验平台深度测评:基于MCP接口管理的Oracle风格SQL实战

文章目录 一、平台环境与准备二、引导体验1.检查数据库版本及服务状态 三、建库与建表1. 建库&#xff08;KingbaseES中通常无需显式建库&#xff0c;此处以创建schema模拟&#xff09;2. 建表 四、查库与数据操作测试1. 查库&#xff08;确认表结构&#xff09;2. 新增数据3. …

echarts开发 | 数据可视化 -- 第三篇 echart进阶配置项 数据集

文章目录 一、概念二、回顾在系列(series)中设置数据三、在数据集中设置数据3.1 数据集(dataset) 基础3.2 二维数组数据(默认) 四、把数据集(dataset) 的行或列 映射为 序列 (series)五、维度(dimension)六、数据到图形的映射 &#xff08;series.encode&#xff09; 一、概念 …

如何科学测算AI业务场景所需算力服务器?——以Qwen3 32B模型与海光K100为例

在人工智能&#xff08;AI&#xff09;技术飞速发展的今天&#xff0c;越来越多企业开始部署大模型应用&#xff0c;如智能问答、文本生成、知识图谱构建等。但如何合理配置硬件资源&#xff0c;既满足业务需求又避免资源浪费&#xff0c;是每个项目实施前必须解决的问题。 本…

渗透实战:利用XSS获取cookie和密码

操作均来自靶场&#xff0c;切勿用于未授权渗透测试&#xff01; Lab 21&#xff1a;将反射型 XSS 注入带有尖括号、单引号、双引号、反斜杠和反引号的 Unicode 转义模板文字中 输入的任何单引号双引号尖括号都会被 unicode 编码 直接换另一种代码执行方式${alert(1)}&#…

Eureka、Nacos、Zookeeper 优雅上下线机制

✅ 三大注册中心优雅上下线机制对比 维度EurekaNacosZookeeper注册方式客户端注册 心跳维持客户端注册 心跳维持客户端创建临时节点服务可用状态控制STARTING、UP、DOWN、OUT_OF_SERVICEUP、DOWN、STARTING 等无显式状态标识&#xff0c;靠节点存在与否判定上线控制方式通过…

Flink与Kubernetes集成

引言 在当今大数据与云计算蓬勃发展的时代&#xff0c;容器编排与流处理技术成为企业数据处理架构的关键支柱。Kubernetes作为容器编排系统的行业标准&#xff0c;能够高效自动化地部署、扩展和管理计算机应用程序&#xff1b;Apache Flink则是流处理和批处理领域的佼佼者&…

第五节:Vben Admin 最新 v5.0 (vben5) 快速入门 - 角色管理模块(上)

Vben5 系列文章目录 💻 基础篇 ✅ 第一节:Vben Admin 最新 v5.0 (vben5) 快速入门 ✅ 第二节:Vben Admin 最新 v5.0 (vben5) 快速入门 - Python Flask 后端开发详解(附源码) ✅ 第三节:Vben Admin 最新 v5.0 (vben5) 快速入门 - 对接后端登录接口(上) ✅ 第四节:Vben Ad…

实施企业预算管理的企微CRM系统技巧:从成本控制到价值创造

一、企微CRM管理系统为何成为预算管理新引擎? 官方数据显示&#xff0c;接入企微CRM系统的企业平均降低客户管理成本28%&#xff0c;预算执行效率提升40%。这源于企微CRM管理软件的三大独特优势&#xff1a; 原生集成能力&#xff1a;与企业微信通讯录、会话存档无缝对接&…