绿色风's Blog
专注AutoIT(Au3)
  • 首页
  • 流●年
  • 笔●记
    • 学习随记
    • 源码示例
  • 脚●本
    • UDF(收集)
    • 工作室UDF
    • 工具●教程
    • 教程之GDI
  • 作●品
  • 下●载
  • 情怀ExcelTip
3月122019

显示器亮度,对比度,色温缩放调节,笔记本亮度调节

作者:绿色风   发布:2019-3-12 4:57 Tuesday   分类:源码示例   阅读:8949次   评论:1条  

本文来源ACN站:gyp2000

 
可以设置显示器的亮度,对比度,16:9<->4:3切换。
设置显示器色温。
并且支持笔记本内置屏幕亮度调节
q1.png

q2.png

```#include <WinAPI.au3> #include <WinAPIFiles.au3> #include <WinAPIGdi.au3> #include <GUIConstantsEx.au3> #include <GuiSlider.au3> #include <Array.au3> Opt("GUIOnEventMode", 1) $g_szVersion = "RU1Y2-D59U9" If WinExists($g_szVersion) Then Exit AutoItWinSetTitle($g_szVersion) Global Const $Dxva2 = DllOpen("Dxva2.dll") If @error Then Exit 1 Global Const $tagSTRUCT = "HANDLE hPhysicalMonitor;WCHAR szPhysicalMonitorDescription[128];" Global Const $tag_MC_TIMING_REPORT = "BYTE bTimingStatusByte; DWORD dwHorizontalFrequencyInHZ; DWORD dwVerticalFrequencyInHZ" Global Const $tag_DISPLAY_BRIGHTNESS = "byte ucDisplayPolicy; byte ucACBrightness; byte ucDCBrightness" Global Const $IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS = _WinAPI_IOCTL($FILE_DEVICE_VIDEO, 0x125, $METHOD_BUFFERED, $FILE_ANY_ACCESS) Global Const $IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS = _WinAPI_IOCTL($FILE_DEVICE_VIDEO, 0x126, $METHOD_BUFFERED, $FILE_ANY_ACCESS) Global Const $IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS = _WinAPI_IOCTL($FILE_DEVICE_VIDEO, 0x127, $METHOD_BUFFERED, $FILE_ANY_ACCESS) Global $idSlider1, $idSlider2, $idButton1, $idButton2, $idLabel1, $idLabel2 Global $hMonitor, $brightness, $contrast, $switch1, $switch2, $VCPReply Global $idLabel3, $idSlider3, $hDevice, $BRIGHTNESS_LCD_Array $hDevice = LCD() If Not @error Then LCD_Set($hDevice) If $hDevice Then _WinAPI_CloseHandle($hDevice) DllClose($Dxva2) Exit EndIf $hMonitor = _WinAPI_MonitorFromWindow(_WinAPI_GetDesktopWindow(), $MONITOR_DEFAULTTOPRIMARY) ;返回主显示器句柄 $hMonitor = _GetPhysicalMonitorsFromHMONITOR($hMonitor) ;获取物理显示器句柄 $StringLength = CapabilitiesRequestAndCapabilitiesReply($hMonitor) $Gui = GUICreate("显示器设置", 262, 220, -1, -1) GUISetOnEvent($GUI_EVENT_CLOSE, "_exit") $idSlider1 = GUICtrlCreateSlider(10, 30, 240, 20, BitOR($TBS_TOOLTIPS, $TBS_AUTOTICKS)) GUICtrlSetOnEvent($idSlider1, "Brightness") GUICtrlSetLimit($idSlider1, 100) $idSlider2 = GUICtrlCreateSlider(10, 82, 240, 20, BitOR($TBS_TOOLTIPS, $TBS_AUTOTICKS)) GUICtrlSetOnEvent($idSlider2, "Contrast") GUICtrlSetLimit($idSlider2, 100) $idButton1 = GUICtrlCreateButton("宽屏切换", 16, 160, 85, 25) GUICtrlSetOnEvent($idButton1, "Button1") $idButton2 = GUICtrlCreateButton("恢复默认", 158, 160, 85, 25) GUICtrlSetOnEvent($idButton2, "Button2") $idLabel1 = GUICtrlCreateLabel(" 亮度调节:不可用", 10, 10, 140, 20) $idLabel2 = GUICtrlCreateLabel("对比度调节:不可用", 10, 60, 140, 20) $Combo1 = GUICtrlCreateCombo("", 102, 120, 100, 25, 0x0003) GUICtrlSetOnEvent($Combo1, "Color") GUICtrlCreateLabel("色温调节", 32, 124, 48, 20) _GUICtrlSlider_SetTipSide($idSlider1, $TBTS_TOP) _GUICtrlSlider_SetTipSide($idSlider2, $TBTS_TOP) If $StringLength <> "" Then $VCP_Array = Manage_vcp($StringLength) $VCPReply = _GetVCPFeatureAndVCPFeatureReply($hMonitor, 0x86) If $VCPReply[0] = 0 Then GUICtrlSetState($idButton1, $GUI_DISABLE) $brightness = _GetMonitorBrightness($hMonitor) ;获取监视器亮度 ConsoleWrite($brightness[1] & @CRLF) $contrast = _GetMonitorContrast($hMonitor) ;获取监视器对比度 If $brightness[2] <> 0 Then $switch1 = True If $contrast[2] <> 0 Then $switch2 = True If $switch1 Then GUICtrlSetData($idSlider1, $brightness[1]) GUICtrlSetData($idLabel1, "设置亮度:" & $brightness[1]) EndIf If $switch2 Then GUICtrlSetData($idSlider2, $contrast[1]) GUICtrlSetData($idLabel2, "设置对比度:" & $contrast[1]) EndIf For $i = 0 To UBound($VCP_Array) - 1 If $VCP_Array[$i][0] = "14" Then If $VCP_Array[$i][1] <> "" Then $Color_Array = StringSplit($VCP_Array[$i][1], " ", 2) $Color_String = "" For $S = 0 To UBound($Color_Array) - 1 $temp = Select_Color($Color_Array[$S]) If $temp <> "" Then $Color_String &= $temp & "|" Next EndIf ExitLoop EndIf Next If $Color_String <> "" Then $VCPCode = _GetVCPFeatureAndVCPFeatureReply($hMonitor, 0x14) GUICtrlSetData($Combo1, $Color_String, Select_Color($VCPCode[1] - 1)) Else GUICtrlSetData($Combo1, "不支持", "不支持") GUICtrlSetState($Combo1, $GUI_DISABLE) EndIf GUISetState(@SW_SHOW, $Gui) Else WinSetTitle($Gui, "", "未发现DDC/CI") GUICtrlSetData($Combo1, "不支持", "不支持") GUICtrlSetState($idSlider1, $GUI_DISABLE) GUICtrlSetState($idSlider2, $GUI_DISABLE) GUICtrlSetState($idButton1, $GUI_DISABLE) GUICtrlSetState($Combo1, $GUI_DISABLE) GUISetState(@SW_SHOW, $Gui) EndIf While 1 Sleep(50) WEnd Func LCD() Local $iDevice $iDevice = _WinAPI_CreateFileEx("\\.\LCD", $OPEN_EXISTING, $GENERIC_READ + $GENERIC_WRITE, $FILE_ANY_ACCESS, 0) Return (@error) ? (SetError(1, _WinAPI_GetLastErrorMessage(), False)) : ($iDevice) EndFunc ;==>LCD Func LCD_Set($iDevice) Local $brightness = DllStructCreate("BYTE[256]") Local $DISPLAY_BRIGHTNESS = DllStructCreate("BYTE[3]") $success = _WinAPI_DeviceIoControl($iDevice, $IOCTL_VIDEO_QUERY_SUPPORTED_BRIGHTNESS, Null, 0, DllStructGetPtr($brightness), 0xff) If $success = False Then Return $BRIGHTNESS_LCD_Array = Brightness_lcd(DllStructGetData($brightness, 1)) $success = _WinAPI_DeviceIoControl($iDevice, $IOCTL_VIDEO_QUERY_DISPLAY_BRIGHTNESS, Null, 0, DllStructGetPtr($DISPLAY_BRIGHTNESS), 0x03) If $success = False Then Return $DISPLAY_BRIGHTNESS_READ = Int(BinaryMid(DllStructGetData($DISPLAY_BRIGHTNESS, 1), 3, 1)) $Gui = GUICreate("内置LCD显示器", 262, 80, -1, -1) GUISetOnEvent($GUI_EVENT_CLOSE, "_exit") $idSlider3 = GUICtrlCreateSlider(10, 30, 240, 20, BitOR($TBS_TOOLTIPS, $TBS_AUTOTICKS)) GUICtrlSetLimit($idSlider3, 100) $idLabel3 = GUICtrlCreateLabel(" 亮度调节:", 10, 10, 140, 20) GUICtrlSetData($idSlider3, $DISPLAY_BRIGHTNESS_READ) GUICtrlSetData($idLabel3, "设置亮度:" & $DISPLAY_BRIGHTNESS_READ) GUICtrlSetOnEvent($idSlider3, "Brightness_set_lcd") GUISetState(@SW_SHOW, $Gui) WinSetTitle($Gui, "", "内置LCD显示器") While 1 Sleep(50) WEnd EndFunc ;==>LCD_Set Func Brightness_set_lcd() Local $lcd_BRIGHTNESS, $DISPLAY_BRIGHTNESS, $success $lcd_BRIGHTNESS = GUICtrlRead($idSlider3) GUICtrlSetData($idLabel3, "设置亮度:" & $lcd_BRIGHTNESS) For $i = 0 To UBound($BRIGHTNESS_LCD_Array) If $lcd_BRIGHTNESS <= $BRIGHTNESS_LCD_Array[$i] Then $DISPLAY_BRIGHTNESS = DllStructCreate($tag_DISPLAY_BRIGHTNESS) DllStructSetData($DISPLAY_BRIGHTNESS, "ucDisplayPolicy", 3) DllStructSetData($DISPLAY_BRIGHTNESS, "ucACBrightness", $BRIGHTNESS_LCD_Array[$i]) DllStructSetData($DISPLAY_BRIGHTNESS, "ucDCBrightness", $BRIGHTNESS_LCD_Array[$i]) $success = _WinAPI_DeviceIoControl($hDevice, $IOCTL_VIDEO_SET_DISPLAY_BRIGHTNESS, DllStructGetPtr($DISPLAY_BRIGHTNESS), DllStructGetSize($DISPLAY_BRIGHTNESS), Null, 0) If $success = False Then Return ExitLoop EndIf Next EndFunc ;==>Brightness_set_lcd Func Select_Color($iValue) Local $String If StringIsXDigit($iValue) Then $iValue = Dec($iValue) Switch $iValue Case 1 $String = "sRGB" Case 2 $String = "原生显示" Case 3 $String = "4000K" Case 4 $String = "5000K" Case 5 $String = "6500K" Case 6 $String = "7500K" Case 7 $String = "8200K" Case 8 $String = "9300K" Case 9 $String = "10000K" Case 10 $String = "11500K" Case 11 $String = "User1" Case 12 $String = "User2" Case 13 $String = "User3" Case Else EndSwitch Return $String EndFunc ;==>Select_Color Func Color() Local $iValue = GUICtrlRead($Combo1) Select Case $iValue = "sRGB" _SetVCPFeature($hMonitor, 0x14, 0x01) Case $iValue = "原生显示" _SetVCPFeature($hMonitor, 0x14, 0x02) Case $iValue = "4000K" _SetVCPFeature($hMonitor, 0x14, 0x03) Case $iValue = "5000K" _SetVCPFeature($hMonitor, 0x14, 0x04) Case $iValue = "6500K" _SetVCPFeature($hMonitor, 0x14, 0x05) Case $iValue = "7500K" _SetVCPFeature($hMonitor, 0x14, 0x06) Case $iValue = "8200K" _SetVCPFeature($hMonitor, 0x14, 0x07) Case $iValue = "9300K" _SetVCPFeature($hMonitor, 0x14, 0x08) Case $iValue = "10000K" _SetVCPFeature($hMonitor, 0x14, 0x09) Case $iValue = "11500K" _SetVCPFeature($hMonitor, 0x14, 0x0a) Case $iValue = "User1" _SetVCPFeature($hMonitor, 0x14, 0x0b) Case $iValue = "User2" _SetVCPFeature($hMonitor, 0x14, 0x0c) Case $iValue = "User3" _SetVCPFeature($hMonitor, 0x14, 0x0d) Case Else EndSelect EndFunc ;==>Color Func Button1() Local $VCPCode If $switch1 And $switch2 Then $VCPCode = _GetVCPFeatureAndVCPFeatureReply($hMonitor, 0x86) ConsoleWrite($VCPCode[1] & @CRLF) If $VCPCode[1] = 8 Then _SetVCPFeature($hMonitor, 0x86, 0x02) GUICtrlSetData($idButton1, "窄屏") Else _SetVCPFeature($hMonitor, 0x86, 0x08) GUICtrlSetData($idButton1, "宽屏") EndIf EndIf EndFunc ;==>Button1 Func Button2() GUICtrlSetData($idButton2, "Reset..") Sleep(250) GUISetState(@SW_HIDE) If $switch1 Or $switch2 Then _RestoreMonitorFactoryDefaults($hMonitor) Sleep(1000) EndIf _DestroyPhysicalMonitor($hMonitor) ;关闭监视器句柄 DllClose($Dxva2) Exit EndFunc ;==>Button2 Func Brightness() If Not $switch1 Then Return GUICtrlSetData($idLabel1, "设置亮度:" & GUICtrlRead($idSlider1)) _SetMonitorBrightness($hMonitor, GUICtrlRead($idSlider1)) EndFunc ;==>Brightness Func Contrast() If Not $switch2 Then Return GUICtrlSetData($idLabel2, "设置对比度:" & GUICtrlRead($idSlider2)) _SetMonitorContrast($hMonitor, GUICtrlRead($idSlider2)) EndFunc ;==>Contrast Func _GetMonitorBrightness(Const $h_monitor) Local Const $MinimumBrightness = DllStructCreate("dword_ptr") Local Const $CurrentBrightness = DllStructCreate("dword_ptr") Local Const $MaximumBrightness = DllStructCreate("dword_ptr") DllCall($Dxva2, "bool", "GetMonitorBrightness", _ "handle", $h_monitor, _ "ptr", DllStructGetPtr($MinimumBrightness), _ "ptr", DllStructGetPtr($CurrentBrightness), _ "ptr", DllStructGetPtr($MaximumBrightness)) If @error Then Return SetError(1, _WinAPI_GetLastErrorMessage(), False) Local Const $brightness[3] = [DllStructGetData($MinimumBrightness, 1), _ DllStructGetData($CurrentBrightness, 1), _ DllStructGetData($MaximumBrightness, 1)] Return $brightness EndFunc ;==>_GetMonitorBrightness Func _GetMonitorContrast(Const $h_monitor) Local Const $MinimumContrast = DllStructCreate("dword_ptr") Local Const $CurrentContrast = DllStructCreate("dword_ptr") Local Const $MaximumContrast = DllStructCreate("dword_ptr") DllCall($Dxva2, "bool", "GetMonitorContrast", _ "handle", $h_monitor, _ "ptr", DllStructGetPtr($MinimumContrast), _ "ptr", DllStructGetPtr($CurrentContrast), _ "ptr", DllStructGetPtr($MaximumContrast)) If @error Then Return SetError(1, _WinAPI_GetLastErrorMessage(), False) Local Const $contrast[3] = [DllStructGetData($MinimumContrast, 1), _ DllStructGetData($CurrentContrast, 1), _ DllStructGetData($MaximumContrast, 1)] Return $contrast EndFunc ;==>_GetMonitorContrast Func _SetMonitorBrightness(Const $h_monitor, Const $NewBrightness) DllCall($Dxva2, "bool", "SetMonitorBrightness", "ptr", $h_monitor, "dword", $NewBrightness) Return (@error ? SetError(1, _WinAPI_GetLastErrorMessage(), False) : True) EndFunc ;==>_SetMonitorBrightness Func _SetMonitorContrast(Const $h_monitor, Const $contrast) DllCall($Dxva2, "bool", "SetMonitorContrast", "ptr", $h_monitor, "dword", $contrast) Return (@error ? SetError(1, _WinAPI_GetLastErrorMessage(), False) : True) EndFunc ;==>_SetMonitorContrast Func _GetPhysicalMonitorsFromHMONITOR(Const $pMonitor) Local $Number = DllStructCreate("DWORD") Local $i, $tagPhysical, $M = 1 $Ret = DllCall($Dxva2, "bool", "GetNumberOfPhysicalMonitorsFromHMONITOR", _ "handle", $pMonitor, _ "ptr", DllStructGetPtr($Number)) $NumberOfMonitors = DllStructGetData($Number, 1) For $i = 1 To $NumberOfMonitors $tagPhysical &= $tagSTRUCT Next $MonitorArray = DllStructCreate($tagSTRUCT) $Ret = DllCall($Dxva2, "bool", "GetPhysicalMonitorsFromHMONITOR", _ "handle", $pMonitor, _ "DWORD", $NumberOfMonitors, _ "ptr", DllStructGetPtr($MonitorArray)) Return DllStructGetData($MonitorArray, 1) ;返回第一个显示器句柄 EndFunc ;==>_GetPhysicalMonitorsFromHMONITOR Func CapabilitiesRequestAndCapabilitiesReply(Const $h_monitor) Local Const $tagStringLength = DllStructCreate("dword_ptr") DllCall($Dxva2, "bool", "GetCapabilitiesStringLength", "handle", $h_monitor, "ptr", DllStructGetPtr($tagStringLength)) Local Const $CapabilitiesStringLength = DllStructGetData($tagStringLength, 1) Local Const $CapabilitiesString = DllStructCreate("char[" & $CapabilitiesStringLength & ']') DllCall($Dxva2, "bool", "CapabilitiesRequestAndCapabilitiesReply", _ "handle", $h_monitor, _ "ptr", DllStructGetPtr($CapabilitiesString), _ "dword", DllStructGetSize($CapabilitiesString)) Return (@error) ? (SetError(1, _WinAPI_GetLastErrorMessage(), False)) : (DllStructGetData($CapabilitiesString, 1)) EndFunc ;==>CapabilitiesRequestAndCapabilitiesReply Func _RestoreMonitorFactoryDefaults(Const $h_monitor) DllCall($Dxva2, "bool", "RestoreMonitorFactoryDefaults", "ptr", $h_monitor) Return (@error) ? (SetError(1, _WinAPI_GetLastErrorMessage(), False)) : (True) EndFunc ;==>_RestoreMonitorFactoryDefaults Func _SetVCPFeature(Const $h_monitor, Const $VCPCode, Const $NewValue) DllCall($Dxva2, "bool", "SetVCPFeature", _ "handle", $h_monitor, _ "byte", $VCPCode, _ "dword", $NewValue) Return (@error) ? (SetError(1, _WinAPI_GetLastErrorMessage(), False)) : (True) EndFunc ;==>_SetVCPFeature Func _GetVCPFeatureAndVCPFeatureReply(Const $h_monitor, Const $VCPCode) Local Const $CurrentValue = DllStructCreate("dword_ptr") Local Const $MaximumValue = DllStructCreate("dword_ptr") Local Const $VCPCodeType = DllStructCreate("dword_ptr") DllCall($Dxva2, "bool", "GetVCPFeatureAndVCPFeatureReply", _ "handle", $h_monitor, _ "byte", $VCPCode, _ "ptr", DllStructGetPtr($VCPCodeType), _ "ptr", DllStructGetPtr($CurrentValue), _ "ptr", DllStructGetPtr($MaximumValue)) If @error Then Return SetError(1, _WinAPI_GetLastErrorMessage(), False) Local Const $VCPFeatureReply[3] = [DllStructGetData($VCPCodeType, 1), DllStructGetData($CurrentValue, 1), DllStructGetData($MaximumValue, 1)] Return $VCPFeatureReply EndFunc ;==>_GetVCPFeatureAndVCPFeatureReply Func Manage_vcp(Const $String) Local $Exp, $i, $tmp, $OUT_String $Exp = StringRegExp($String, "(?<=vcp\()([A-Za-z0-9]{2}[\)\(]?\s?)*(?=\))", 2) If @error Then Return $Exp = StringRegExp($Exp[0], "([0-9A-Fa-f]{2})(\(.+?\))?", 4) If @error Then Return Local $Array[UBound($Exp)][2] For $i = 0 To UBound($Exp) - 1 $tmp = $Exp[$i] $Array[$i][0] = StringStripWS(StringLeft($tmp[0], 2), 8) $OUT_String = StringStripWS(StringTrimLeft($tmp[0], 2), 3) If $OUT_String <> "" Then $OUT_String = StringTrimLeft(StringTrimRight($OUT_String, 1), 1) $Array[$i][1] = $OUT_String EndIf Next Return $Array EndFunc ;==>Manage_vcp Func _DestroyPhysicalMonitor(Const $h_monitor) DllCall($Dxva2, "bool", "DestroyPhysicalMonitor", "ptr", $h_monitor) Return (@error) ? (SetError(1, _WinAPI_GetLastErrorMessage(), False)) : (True) EndFunc ;==>_DestroyPhysicalMonitor Func Brightness_lcd(Const $BRIGHTNESS_Lcd) Local $BRIGHTNESS_String, $tmp, $i For $i = 1 To BinaryLen($BRIGHTNESS_Lcd) $tmp = Int(BinaryMid($BRIGHTNESS_Lcd, $i, 1)) If $i = 1 Then $BRIGHTNESS_String &= $tmp & ";" Else If $tmp = 0 Then ExitLoop $BRIGHTNESS_String &= $tmp & ";" EndIf Next Return StringSplit(StringTrimRight($BRIGHTNESS_String, 1), ";", 2) EndFunc ;==>Brightness_lcd Func _exit() If $hDevice Then _WinAPI_CloseHandle($hDevice) _DestroyPhysicalMonitor($hMonitor) ;关闭监视器句柄 DllClose($Dxva2) Exit EndFunc ;==>_exit```


成品源码下载: 显示器设置.zip





本文固定链接: http://www.jianyiit.com/post-303.html

blogger
该日志由 绿色风 于2019-3-12 4:57 Tuesday发表在 源码示例 分类下。
版权所有:《绿色风's Blog》 → 《显示器亮度,对比度,色温缩放调节,笔记本亮度调节》;
除特别标注,本博客很多文章均为原创. 互联分享,尊重版权,转载请以链接形式标明本文地址;
本文标签:

扫描二维码,在手机上阅读
上一篇::显示器 EDID 读取,生产日期和分辨率
下一篇:字符串打乱顺序

热门文章

相关文章

  • AU3真正的 修改IE 代理 即使生效·
  • GDI+示例1
  • 跟随鼠标的图型
  • win系统事件消息监控
  • AU3拼图游戏
评论列表 ↓
呦,果断人中龙凤! 1      2020-03-17 10:58 @回复
大佬大佬,有C#的吗,初学者想学习一下
取消回复

发表评论

亲,头像对么?

72 + 69 =

提交中,请稍候……


木有头像就木JJ啦!还木有头像吗?点这里申请属于你的个性Gravatar头像吧!


    站点统计
    • 运行时间: 20254 天
    • 日志总数: 365 篇
    • 评论数量: 7238 条
    • 微语数量: 6 条
    • 附件总量: 388 件
  • 逝出的青春

  • 打赏"绿色风"



      扫码关注本站公众号 可搜本站内容

  • Autoit V3 脚本交流群

      常驻群1:905774875
      常驻群2:40672266


  • 链接

    • AU3中文论坛
    • Excel资料库
    • 完美者博客
    • 顺网小哥'S Blog
    • 猛牛哥的博客
    • 网吧系统下载
  • 分类

    • 流●年(66)
    • 笔●记(0)
    • 脚●本(0)
    • 作品(21)
    • 学习随记(51)
    • 源码示例(68)
    • UDF(收集)(26)
    • 工作室UDF(30)
    • 工具●教程(62)
    • 教程之GDI(24)
Copyright © 2013 绿色风's Blog. Powered by emlog. Theme by 射雕天龙. 鄂ICP备2021011689号-1 鄂公网安备42102302000078号 sitemap