??? 從零打造Windows屏幕控制大師:息屏+亮度調節+快捷鍵一體化解決方案
?? 個人主頁:創客白澤 - CSDN博客
?? 系列專欄:??《Python開源項目實戰》
?? 熱愛不止于代碼,熱情源自每一個靈感閃現的夜晚。愿以開源之火,點亮前行之路。
?? 希望大家多多支持,我們一起進步!
?? ??如果文章對你有幫助的話,歡迎 點贊 ???? 評論 ?? 收藏 ?? 加關注+??分享給更多人哦
?? 概述
在數字化辦公時代,屏幕管理已成為提升工作效率和保護眼睛健康的重要環節。今天我將分享一個基于Python和PySide6開發的Windows屏幕控制工具,它集成了一鍵息屏、亮度調節、自動息屏時間設置和全局快捷鍵等實用功能,并支持系統托盤運行和開機自啟動。
本文將深入解析這個工具的實現原理、關鍵技術點和完整代碼,適合有一定Python基礎的開發者學習GUI開發、系統級操作和實用工具開發。
?? 功能亮點
-
?? 一鍵息屏功能
- 立即關閉顯示器節省能源
- 支持全局快捷鍵觸發(可自定義)
-
?? 自動息屏時間設置
- 預設常用時間(1/5/10/15/30/60分鐘)
- 支持自定義任意分鐘數
- 永不息屏模式
-
?? 屏幕亮度控制
- 0-100%無級調節
- 預設常用亮度檔位
- 亮度調節快捷鍵支持
-
?? 實用附加功能
- 系統托盤運行
- 開機自啟動
- 啟動時最小化
- 當前設置實時顯示
??? 界面展示
主界面設計
界面采用現代化設計,包含:
- 醒目的標題區
- 快速息屏大按鈕
- 自動息屏時間預設區
- 亮度控制滑塊
- 應用設置面板
- 當前設置顯示區
系統托盤菜單
??? 實現步驟詳解
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. 多方法亮度控制
亮度控制模塊采用了策略模式,依次嘗試三種不同的亮度調節方法:
- WMI方式:最原生的Windows管理接口
- PowerShell方式:兼容性更好的腳本方法
- 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