前言

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

如果是笔记本,可以在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. 手机屏幕xy坐标软件_软件工程中的xy问题

    手机屏幕xy坐标软件 XY problem is classified as a communication problem in which the person who asks the ques ...

  2. 手机屏幕厂家信息软件_悬浮在手机屏幕的备忘录有哪些?手机桌面备忘录便签提醒软件...

    两手指捏合或者长按手机桌面空白处地方,在手机屏幕的窗口小工具中找到一个应用软件,即可将该软件悬挂至手机主屏幕上显示,安卓手机通常采用这一方法将一些常用的软件放在手机桌面上显示. 日常工作.生活中,大家 ...

  3. python控制手机屏幕亮度的软件_Python脚本利用adb进行手机控制

    Python脚本利用adb进行手机控制 一. adb 相关命令:1. 关闭adb服务:adb kill-server2. 启动adb服务 adb start-server3. 查询当前运行的所有设备 ...

  4. python控制手机屏幕亮度的软件,屏幕亮度调节软件 - osc_52491840的个人空间 - OSCHINA - 中文开源技术交流社区...

    您是否正在寻找屏幕调光器? 那您来对地方了. 因为今天我将向您展示最受欢迎的屏幕调光器解决方案. 为什么需要屏幕调光器? 明亮的光线使眼睛刺痛和干眼 明亮的光线使眼睛疲劳 明亮的灯光使您更难以入睡 因 ...

  5. python控制手机屏幕亮度的软件,通过adb操作安卓亮屏、设置背光亮度、解锁、打开app...

    亮屏 adb shell inputkeyevent 26 keyevent 26表示点击power Android adb 点亮和关闭屏幕的命令 # kernel休眠 echo mem > / ...

  6. 手机屏幕镜像翻转软件_可以把ipad投屏到电视吗?屏幕镜像一键投屏

    出于方便,很多人习惯在ipad上看视频,因为它的体积.屏幕刚刚好,适合携带在身,想看视频的时候就看.不过,宅在家里的时候,我觉得还是在电视上看视频比较过瘾,毕竟屏幕大.但是,电视上没有我喜欢看的视频, ...

  7. 手机屏幕厂家信息软件_微软Surface Duo SwiftKey键盘更新 将允许键盘在两个屏幕上分割_华强北软件网_软件行情_软件新闻_软件评测_手机应用文章...

    原标题:微软 Surface Duo 双屏手机 SwiftKey 键盘迎来更新:支持分体式输入 双屏手机 Surface Duo 采用了微软的 SwiftKey 键盘,实现了无缝打字体验.Surfac ...

  8. 手机屏幕厂家信息软件_警惕假个税手机软件蹭热点,千万别被窃取私人信息

    新个税法从1月初开始实施.2018年12月31日,国家税务总局推出"个人所得税"APP,方便纳税人线上填报资料进行专项抵扣. 几天来,这款APP的下载量和注册量大幅增长.随之而来的 ...

  9. python实现二维码识别软件_用 Python 生成 识别二维码

    说到二维码大家一定不陌生,可以说现在二维码几乎渗透到了我们生活的各个角落,举例来说吧,我们到超市商场购物时扫描二维码付款,我们出行时乘坐公交地铁扫描二维码进站,我们到菜鸟驿站取件时扫描二维码取件,如果 ...

最新文章

  1. Android开发之使用Handler封装下载图片工具类(源代码分享)
  2. c# Ajax后台动态分页
  3. C#上位机软件串口数据接收用Invoke(同步)和BeginInvoke(异步)的区别
  4. 【MPI编程】MPI_Bcast广播讲解和使用
  5. 设计模式:讲在设计模式之前
  6. 柔性太阳能电池pdf_房车旅行如何做到电力无忧,那就选择一套合适的太阳能供电系统吧...
  7. Ubuntu 修改默认的PDF打开方式
  8. oracle idl_ub1$,system表空间急剧增大原因分析
  9. C#.Net工作笔记006---关于各种四舍五入_小数点保留第几位等操作_随时更新
  10. NetApp F3020 盘柜报警升级修复全过程
  11. 小知识--局域网内的文件共享
  12. 联想y430完全拆机图解_联想Y430P笔记本拆机加内存和SSD图文教程
  13. 高速学英语- 大脑的不同学习机制
  14. Android手机号码获取问题 用APN来获取手机号
  15. iapp将音量调至最大
  16. revit二开之关联族参数的实现
  17. Matlab中的图怎样插入Word效果最好
  18. 怎么调出全局搜索_eclipse全局搜索快捷键是什么
  19. iOS开发:简易天气预报
  20. 计算机期刊杂志投稿指南

热门文章

  1. 空光盘复制后到另外计算机无法读取,为什么我刻录的CD盘在另一个计算机上不能读?...
  2. Solidworks2019无法获得许可,无效的(不一致的)使用许可码。(-8,544,0)
  3. 批处理bat万能删除文件/夹
  4. 用树莓派纯手工打造车载车牌识别检测系统,家用车秒变智能车!
  5. 刚入圈的萌新小白想说的
  6. 用函数实现strcmp(C语言)
  7. android9的手机,手机 篇九:一加9R之光藏于机身内外 新品深度体验
  8. Barsetto百胜图美式便携咖啡机,总有这杯在身边
  9. 微信保存图片提示失败_微信公众号多图文素材编辑完成保存失败该怎么解决?...
  10. 缓存更新策略概览(Caching Strategies Overview)