dxva2 dll()

如今,笔记本电脑通常会有一个 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