[AHK2] 亮度控制

发布时间 2023-07-26 15:08:20作者: dkwd

开始

ahk本身并未提供亮度控制的快捷api,所以需另寻它法。

  • 一种是借助DllCall调用win32函数。
  • 另一种是使用ComObj。
  • 最后是使用Run调用cmd。

我尝试使用DllCall,但并未成功,水平仍不足。

后来在ahk手册找到使用ComObj调用cmd的方法,很好实现。但使用此方式会出现cmd闪屏,实际上使用ahk的run方法更好,不过仍有使用它的理由。
关于使用run调用cmd的方法请看下面‘更常用的方式’。

使用COM对象

前置

  • 封装两个方法,使用com对象执行一条cmd和多条cmd。
class ShellRun {
    static RunWaitOne(command) {
        shell := ComObject("WScript.Shell")
        ; 通过 cmd.exe 执行单条命令
        exec := shell.Exec(A_ComSpec " /C " command)
        ; 读取并返回命令的输出
        return exec.StdOut.ReadAll()
    }

    static RunWaitMany(commands) {
        shell := ComObject("WScript.Shell")
        ; 打开 cmd.exe 禁用命令回显
        exec := shell.Exec(A_ComSpec " /Q /K echo off")
        ; 发送并执行命令, 使用新行分隔
        exec.StdIn.WriteLine(commands "`nexit")  ; 总是在最后退出!
        ; 读取并返回所有命令的输出
        return exec.StdOut.ReadAll()
    }
}

来源:https://wyagd001.github.io/v2/docs/lib/Run.htm

封装亮度相关方法

class MonitorBrightness {
    ; class-desc: 提供屏幕亮度获取及设置方法

    static GetBrightness() {
        fields := ShellRun.RunWaitOne('WMIC /NAMESPACE:\\root\wmi PATH WmiMonitorBrightness WHERE "Active=TRUE" GET /value')
        match := 'CurrentBrightness='
        curLight := SubStr(fields, InStr(fields, match) + StrLen(match), 2)
        return +Trim(curLight, '`n')
    }

    static IncBrightness(val) {
        curLight := MonitorBrightness.GetBrightness()
        ShellRun.RunWaitOne('WMIC /NAMESPACE:\\root\wmi PATH WmiMonitorBrightnessMethods WHERE "Active=TRUE" CALL WmiSetBrightness Brightness=' curLight + val ' Timeout=0')
    }

    static DescBrightness(val) {
        curLight := MonitorBrightness.GetBrightness()
        ShellRun.RunWaitOne('WMIC /NAMESPACE:\\root\wmi PATH WmiMonitorBrightnessMethods WHERE "Active=TRUE" CALL WmiSetBrightness Brightness=' curLight - val ' Timeout=0')
    }
}

热键调用

^Home:: MonitorBrightness.IncBrightness(2)
^End:: MonitorBrightness.DescBrightness(2)

缺点

会出现cmd窗口的闪屏。

更常用的方式

上面的方法可以细腻的调节亮度,但一般只要提供昼夜切换亮度即可。

使用Run方法可以隐藏窗口执行,所以不会有闪屏现象,但无法做到细腻的调节。

设置常量

class Constant {
    ; 屏幕亮度
    static lightness_low := 5
    static lightness_normal := 25
}

热键切换亮度

ScrollLock:: {
    ; desc: 切换昼夜亮度
    static flag_brightness := IsSet(flag_brightness) || false
    if flag_brightness
        Run(A_ComSpec ' /c "WMIC /NAMESPACE:\\root\wmi PATH WmiMonitorBrightnessMethods WHERE "Active=TRUE" CALL WmiSetBrightness Brightness=' Constant.lightness_normal ' Timeout=0"', , 'Hide')
    else
        Run(A_ComSpec ' /c "WMIC /NAMESPACE:\\root\wmi PATH WmiMonitorBrightnessMethods WHERE "Active=TRUE" CALL WmiSetBrightness Brightness=' Constant.lightness_low ' Timeout=0"', , 'Hide')
    flag_brightness := !flag_brightness
}

最后

一般键盘都会提供调节亮度及多媒体的快捷键,可惜更换键盘后我便只剩下音量调节,且需配合fn,使用起来十分不便。百度没找到理想的解决方法,很长一时间是手动调节的,最后还是决定“写个脚本吧……”

靠这个脚本也算解决亮度难题了,尽管不怎么优雅。