无需安装 Windows SDK?用 Python 开发 Win32 显示器调节程序
off999 2024-09-20 22:40 36 浏览 0 评论
如今,笔记本电脑通常会有一个 Fn 按键,该按键组合其他键可以通过丰富的快捷功能,如调节屏幕的亮暗。当笔记本外接显示时,外接显示器的屏幕亮暗则无法快捷键调节。虽然部分品牌显示会提供相关的显示器驱动或工具程序,可以通过软件的方法调节显示器,但是有些显示器并没有官方提供的工具软件,只能通过显示器上的按键来调节,非常的麻烦与不便。但这类显示器并不不可以通过软件调节,只要显示器支持 DDC/CI 协议都是可以通过软件调节显示器的。直接下载安装互联网上未知来源的程序通常是具有风险的,如包含病毒和木马程序,因此,有必要使用 Python语言编写一个安全自用的调节软件。
众所周知,Python 一个非常易于使用的编程语言,相比较而言 Win32 编程则要复杂得多。仅仅是 Visual Studio 的安装就要占据近 10GB 的硬盘空间。Python 搭配 VS Code 则更加轻便与快捷。Python 被称为胶水语言的原因就是它是一种用来连接软件组件的程序设计语言。它通过 ctypes 模块可以非常轻松方便的调用动态连接库里的函数,这就为 Python 调用 Win32 API 提供了方便。Windows API 大多存在于 kernel32.dll, user32.dll 等一些列动态连接库里,Python 直接调用 Windows DLL 的函数可以免除 Windows SDK 的安装。而这通常是编译型语言如 C/C++ 必须要安装的文件,否则无法编译。
调用 Win32 API
在 Python 中调用 Win32 API 是非常方便的,Windows 大多数的函数接口都在 ctypes.windll 中。Windows 中关于显示器接口的文档可在微软官方网站上获得。例如获取一个显示器句柄中包含的物理显示器个数的代码如下:
def get_physical_monitors_from_HMONITOR(hmonitor: wintypes.HMONITOR):
num = wintypes.DWORD()
windll.Dxva2.GetNumberOfPhysicalMonitorsFromHMONITOR(hmonitor, byref(num))
class PHYSICAL_MONITOER(Structure):
_fields_ = [
("hPhysicalMonitor", wintypes.HANDLE),
("szPhysicalMonitorDescription", wintypes.WCHAR*128)
]
phy_monitors_arr = (PHYSICAL_MONITOER * num.value)()
windll.Dxva2.GetPhysicalMonitorsFromHMONITOR(hmonitor, num, phy_monitors_arr)
return list(phy_monitors_arr)
ctypes.wintypes 中包含了 Windows 中的相关类型,如DWORD,HANDLE等。 PHYSICAL_MONITOR 类则定义了一个 C 接口体,它继承了 ctypes 中的 Structure 类。而 phy_monitors_arr 则声明了一个 C 语言数组。最后调用 Dxva2.dll 中的GetPhysicalMonitorsFromHMONITOR 函数就可以获得具体的物理显示器个数了。相关的详细说明可见 ctypes 模块的文档以及微软 Monitor Configuration 文档。
Python界面编程
PyQt 以及 PySide 是用于在 Python 中使用 QT 进行界面编程的模块。QT 是一个功能非常全面且十分成熟的 UI 界面编写框架,在 Python 中也可以十分方便的进行 QT 开发。以下是基于 QT 编写的显示器调节软件工具,使用了自定义界面。
完整代码见:https://github.com/panderan/BrightnessControl
相关推荐
- 第九章:Python文件操作与输入输出
-
9.1文件的基本操作9.1.1打开文件理论知识:在Python中,使用open()函数来打开文件。open()函数接受两个主要参数:文件名和打开模式。打开模式决定了文件如何被使用,常见的模式有:&...
- Python的文件处理
-
一、文件处理的流程1.打开文件,得到文件句柄并赋值给一个变量2.通过句柄对文件进行操作3.关闭文件示例:d=open('abc')data1=d.read()pri...
- Python处理文本的25个经典操作
-
Python处理文本的优势主要体现在其简洁性、功能强大和灵活性。具体来说,Python提供了丰富的库和工具,使得对文件的读写、处理变得轻而易举。简洁的文件操作接口Python通过内置的open()函数...
- Python学不会来打我(84)python复制文件操作总结
-
上一篇文章我们分享了python读写文件的操作,主要用到了open()、read()、write()等方法。这一次是在文件读写的基础之上,我们分享文件的复制。#python##python自学##...
- python 文件操作
-
1.检查目录/文件使用exists()方法来检查是否存在特定路径。如果存在,返回True;如果不存在,则返回False。此功能在os和pathlib模块中均可用,各自的用法如下。#os模块中e...
- 《文件操作(读写文件)》
-
一、文件操作基础1.open()函数核心语法file=open("filename.txt",mode="r",encoding="utf-8"...
- 栋察宇宙(二十一):Python 文件操作全解析
-
分享乐趣,传播快乐,增长见识,留下美好。亲爱的您,这里是LearingYard学苑!今天小编为大家带来“Python文件操作全解析”欢迎您的访问!Sharethefun,spreadthe...
- 值得学习练手的70个Python项目(附代码),太实用了
-
Python丰富的开发生态是它的一大优势,各种第三方库、框架和代码,都是前人造好的“轮子”,能够完成很多操作,让你的开发事半功倍。下面就给大家介绍70个通过Python构建的项目,以此来学习Pytho...
- python图形化编程:猜数字的游戏
-
importrandomnum=random.randint(1,500)running=Truetimes=0##总的次数fromtkinterimport*##导入所有tki...
- 一文讲清Python Flask的Web编程知识
-
刚入坑Python做Web开发的新手,还在被配置臃肿、启动繁琐折磨?Flask这轻量级框架最近又火出圈,凭5行代码启动Web服务的极致简洁,让90后程序员小张直呼真香——毕竟他刚用这招把部署时间从半小...
- 用python 编写一个hello,world
-
第一种:交互式运行一个hello,world程序:这是写python的第一步,也是学习各类语言的第一步,就是用这种语言写一个hello,world程序.第一步,打开命令行窗口,输入python,第二步...
- python编程:如何使用python代码绘制出哪些常见的机器学习图像?
-
专栏推荐绘图的变量单变量查看单变量最方便的无疑是displot()函数,默认绘制一个直方图,并你核密度估计(KDE)sns.set(color_codes=True)np.random.seed(su...
- 如何编写快速且更惯用的 Python 代码
-
Python因其可读性而受到称赞。这使它成为一种很好的第一语言,也是脚本和原型设计的流行选择。在这篇文章中,我们将研究一些可以使您的Python代码更具可读性和惯用性的技术。我不仅仅是pyt...
- Python函数式编程的详细分析(代码示例)
-
本篇文章给大家带来的内容是关于Python函数式编程的详细分析(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。FunctionalProgramming,函数式编程。Py...
- 编程小白学做题:Python 的经典编程题及详解,附代码和注释(七)
-
适合Python3+的6道编程练习题(附详解)1.检查字符串是否以指定子串开头题目描述:判断字符串是否以给定子串开头(如"helloworld"以"hello&...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python读取文件夹下所有文件 (59)
- java调用python脚本 (56)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)