【開源工具】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
英文地址,請注明出處:http://en.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;與企業微信通訊錄、會話存檔無縫對接&…