前言

不管在电脑屏幕前办公还是娱乐,环境光线在变化,看的东西也在变化。显示器的亮度也应该及时调整,白天亮一些,晚上暗一些,打游戏亮一些,看文档暗一些。

如果是笔记本,可以在Win10的任务栏最右边的通知中心的亮度条上调整,还可以通过键盘快捷键调整。如果是台式机可能就没这么方便了,大多数人应该是对着显示器上的按钮按来按去,十分不方便。实际上,台式机也可以通过键盘鼠标调整显示器亮度。这里分享一个用Python写的更改主显示亮度的脚本。

文档

本人使用的是一款Dell显示器,使用DP接口连接Nvidia显卡。找来找去发现Dell官网有个Dell Display Manager,可以直接在任务栏上弹出滑块调亮度和对比度(网易云右边)。这说明,实际上显示器和操作系统之间是有某个通道的,使得除了视频数据,还可以传输更改亮度这类控制数据。

直接搜"win32 monitor configuration"应该也可以找到(微软的链接没事就变)。还有一个相关的VESA标准,VESA Monitor Control Command Set (MCCS) standard。Internally, the monitor configuration functions use the Display Data Channel Command Interface (DDC/CI) to send commands to the monitor.

Python脚本

虽然有点不科学,不过先写了一个C的程序,实现了亮度的更改。然后,对着ctypes文档翻译成Python即可。如果使用了奇怪的转接头,或者VGA这种接口,大概率是不能用的。

"""Get and set the brightness of the monitor."""

import ctypes

from ctypes import wintypes

PHYSICAL_MONITOR_DESCRIPTION_SIZE = 128

class PHYSICAL_MONITOR(ctypes.Structure):

_fields_ = [('hPhysicalMonitor', wintypes.HANDLE),

('szPhysicalMonitorDescription', ctypes.c_wchar * PHYSICAL_MONITOR_DESCRIPTION_SIZE)]

if __name__ == '__main__':

user32 = ctypes.windll.user32

h_wnd = user32.GetDesktopWindow()

MONITOR_DEFAULTTOPRIMARY = 1

h_monitor = user32.MonitorFromWindow(h_wnd, MONITOR_DEFAULTTOPRIMARY)

print('Monitor Handle', h_monitor)

dxva2 = ctypes.windll.Dxva2

nummons = wintypes.DWORD()

bres = dxva2.GetNumberOfPhysicalMonitorsFromHMONITOR(

h_monitor, ctypes.byref(nummons))

assert bres

print('Number of Monitors', nummons)

physical_monitors = (PHYSICAL_MONITOR * nummons.value)()

bres = dxva2.GetPhysicalMonitorsFromHMONITOR(

h_monitor, nummons, physical_monitors)

assert bres

print('Phyical Monitors', physical_monitors)

physical_monitor = physical_monitors[0]

print(' first', physical_monitor.hPhysicalMonitor,

physical_monitor.szPhysicalMonitorDescription)

min_brightness = wintypes.DWORD()

max_brightness = wintypes.DWORD()

cur_brightness = wintypes.DWORD()

bres = dxva2.GetMonitorBrightness(physical_monitor.hPhysicalMonitor, ctypes.byref(

min_brightness), ctypes.byref(cur_brightness), ctypes.byref(max_brightness))

assert bres

print('Brightness', min_brightness, 'min',

cur_brightness, 'max', max_brightness)

bres = dxva2.SetMonitorBrightness(physical_monitor.hPhysicalMonitor, 10)

assert bres

kernel32 = ctypes.windll.kernel32

err = kernel32.GetLastError()

print(err)

什么额外库都不需要安装,使用Python3执行一下,亮度变化了么?更改下面的10,

bres = dxva2.SetMonitorBrightness(physical_monitor.hPhysicalMonitor, 10)

例如改成80,再执行一下,亮度应该变成80%。下面是我的台式机上执行时的输出,留作对照参考(执行前亮度为5,执行后更亮了,变成了10)

"C:/Program Files/Python38/python.exe" e:/Worky/Python/monitor.py

Monitor Handle 65537

Number of Monitors c_ulong(1)

Phyical Monitors <__main__.physical_monitor_array_1 object at>

first 1 U2518D (DP)

Brightness c_ulong(0) min c_ulong(5) max c_ulong(100)

0

这里就不逐行解释代码了,有疑问欢迎留言。有几个东西需要看下才能完全理解。Win32编程,每个函数直接在Bing上搜就可以跳到微软的文档上。

Python ctypes,可能需要跑一遍文档里的例子。

Windows和ctypes结合。例如怎么知道某个函数在哪个dll上呢?在微软函数文档的最下面的Requirements里。再如找Enum的值,Structure的组成,在Visual Studio的头文件里。

色温

试了一下改色温的接口,也可以用。

# typedef enum _MC_COLOR_TEMPERATURE

# {

# MC_COLOR_TEMPERATURE_UNKNOWN,

# MC_COLOR_TEMPERATURE_4000K,

# MC_COLOR_TEMPERATURE_5000K,

# MC_COLOR_TEMPERATURE_6500K,

# MC_COLOR_TEMPERATURE_7500K,

# MC_COLOR_TEMPERATURE_8200K,

# MC_COLOR_TEMPERATURE_9300K,

# MC_COLOR_TEMPERATURE_10000K,

# MC_COLOR_TEMPERATURE_11500K

# } MC_COLOR_TEMPERATURE, *LPMC_COLOR_TEMPERATURE;

color_temperature = ctypes.c_int32()

bres = dxva2.GetMonitorColorTemperature(physical_monitor.hPhysicalMonitor,

ctypes.byref(color_temperature))

assert bres

print('ColorTemperature', color_temperature)

#dxva2.SetMonitorColorTemperature(physical_monitor.hPhysicalMonitor, 3)

dxva2.SetMonitorColorTemperature(physical_monitor.hPhysicalMonitor, 6)

注意色温只有固定的几个值,是个int,在头文件highlevelmonitorconfigurationapi.h的MC_COLOR_TEMPERATURE里,是个enum,这里复制下来放到了注释里。

这个enum从第一个开始,依次代表0,1,2……。例如6500K是3,9300K是6。

遍历所有显示器

win32的EnumDisplayMonitors可以获取所有显示器。恰好win32api库里封装了这个函数,很方便可以获取

import win32api

monitors = win32api.EnumDisplayMonitors()

for monitor_info in monitors:

h_monitor = monitor_info[0].handle

下面就一样用h_monitor就可以了。

其他

其实有现成的工具软件,可以可视化直接调整多个显示器的亮度。比如Github上有个叫Monitorian的,亲测可用。其实我是看了里面的C#代码的调亮度部分才把自己的C版本调通了。如果喜欢自己动手,封一下用Tkinter写个调亮度UI,多个显示器也可以。会硬件的,买个环境亮度传感器,写个程序,就可以实现像手机那样的自动亮度调整了。文档里还有对比度,色温的接口可以用。

正常使用推荐Monitorian,试过HDMI显示器和DP转VGA连接的显示器,都可以正常使用,甚至可以用同时调整多个显示器的亮度:emoacht/Monitorian: A Windows desktop tool to adjust the brightness of multiple monitors with ease (github.com)​github.com

为啥Windows不自己检测一下台式机的显示器呢?直接放在通知中心岂不更好?其实还有个叫Wmi的东西也可以调亮度,听上去是更高层的接口。并且听说只有可以通过Wmi可以调整亮度时,才能在通知中心显示亮度条,据说是笔记本的做法。通过Monitor Configuration的(例如本Python脚本),估计有些偏底层,微软觉得可能有别的问题,就没显示在通知中心?

python控制屏幕亮度_使用Python脚本更改显示器亮度相关推荐

  1. python控制手机屏幕亮度的软件_使用Python脚本更改显示器亮度

    前言 不管在电脑屏幕前办公还是娱乐,环境光线在变化,看的东西也在变化.显示器的亮度也应该及时调整,白天亮一些,晚上暗一些,打游戏亮一些,看文档暗一些. 如果是笔记本,可以在Win10的任务栏最右边的通 ...

  2. python实现屏幕录制_使用python调用ffmpeg的录制项目总结

    录制项目终于做完,不用总是提醒自己抓紧时间这样来想问题了. 在完成之后带着一些满足感,回头看看哪些地方是需要改进的,哪些地方又是有更好的替代方案,自己又有哪些不足. 下面按照软件的各部分分别做作总结: ...

  3. python 控制手机摄像头_用Python获取摄像头并实时控制人脸 !

    实现流程从摄像头获取视频流,并转换为一帧一帧的图像,然后将图像信息传递给opencv这个工具库处理,返回灰度图像(就像你使用本地静态图片一样) 程序启动后,根据监听器信息,使用一个while循环,不断 ...

  4. python控制步进电机转动_用Python编程:控制步进电机+ Raspberry Pi零+ L293D IC

    (警告!我没有受过这个主题的教育) 嘿伙计.我之所以在这里发布,是因为我有一个非常需要她的项目帮助的朋友.我对脚本很熟悉,但是对编程却不太了解.我从事IT工作,所以我会尽力提供必要的信息.她正在尝试使 ...

  5. python控制网络摄像头_用Python控制摄像头拍照并发邮件

    码农那点事儿 关注我们,一起学习进步 00 概述 前言 工具 思路 安装及导入包 设置参数 实现拍照 构造邮件内容 发送邮件 判断网络连接 开机自启 后记 o1 前言 为什么会有写这个程序的想法呢? ...

  6. python控制摄像头拍照_用Python控制摄像头拍照并发邮件

    1 前言 为什么会有写这个程序的想法呢? 最初的想法是写一个可以用电脑前置摄像头拍照的程序,在舍友使用你电脑的时候,不经意间获取到一大堆奇葩舍友的表情包. 然后我又突发奇想,要不搞个开机启动吧,这样我 ...

  7. python检测屏幕亮点_使用Python和OpenCV检测图像中的多个亮点

    点击上方"蓝色小字"关注我呀 本文来自光头哥哥的博客[Detecting multiple bright spots in an image with Python and Ope ...

  8. python 控制有线网卡_用python写一些网络操作

    展开全部 python写文件 代码如下 复制代32313133353236313431303231363533e4b893e5b19e31333337383339码 object_id_list=[1 ...

  9. python 控制有线网卡_在Python中用socket捕获指定网卡的流量

    本文最后更新于2014年12月22日,已超过 1 年没有更新,如果文章内容失效,还请反馈给我,谢谢! 指定连接到Internet的网卡: Get the IP address for the inte ...

  10. 计算机显示屏对比度怎么调整,显示器的亮度和对比度多少合适?显示器亮度对比度调多少眼睛舒服?...

    液晶显示器是是台式电脑必不可少的显示设备,我们在玩游戏.办公的时候必须要面对显示器,如果显示器没有调整为合适的对比度和亮度,那么会伤害眼睛,对用户的视力会有一定的影响,造成眼疲劳,显示器的亮度和对比度 ...

最新文章

  1. python实现二叉树的重建1 之由前序遍历和中序遍历重建
  2. [BUUCTF-pwn]——wdb_2018_2nd_easyfmt
  3. shu函数php,【函数分享】每日PHP函数分享(2021-3-3)
  4. idea集成python_IDEA集成Python插件,SDK配置
  5. 关于DOM操作的几个类型
  6. 深度学习2.0-14.神经网络与全连接层之全连接层、输出方式、误差计算
  7. 【小家Java】Future与FutureTask的区别与联系
  8. 又挖到宝藏了,低调使用
  9. vegas视频软件使用教程和笔记
  10. C#图像压缩相关方法总结
  11. 文件创建失败 无法继续下载_iOS更新失败了怎么办?教你如何排除故障解决问题...
  12. PS小白怎么学会更换材质效果
  13. Redis在实际项目中的应用
  14. 学会学习 学会交往——访我校85级机电系毕业生辛平
  15. python wxpython菜鸟教程_wxpython新手向教程
  16. “狗屁不通文章生成器”项目登顶GitHub热榜~
  17. 拍照打卡签到活动到达地点拍照上传管理document.getElementById(“myP“).innerHTML=“拍照“;
  18. linux连接mssql数据库,在Centos7下为PHP安装mssql扩展
  19. mysql:Windows修改MySQL数据库密码(修改或忘记密码)
  20. 文件夹无法访问如何解决?

热门文章

  1. 《算法笔记》胡凡 例题/练习 答案
  2. 网站的icon图标与阿里云图标库的使用
  3. 微信小程序订阅服务器,微信小程序之模板订阅消息
  4. Docker镜像重命名
  5. 构建五种机器学习模型作比较(某金融数据集)
  6. PCB传输线阻抗计算工具Polar Si9000的安装方法
  7. 读《About Face 4 交互设计精髓》1
  8. 菜刀之中国蚁剑-安装使用及下载地址
  9. 鱼群算法matlab代码,人工鱼群算法MATLAB实现
  10. mysql mm keeplive_mysql +keeplive