开始
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()
}
}
封装亮度相关方法
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,使用起来十分不便。百度没找到理想的解决方法,很长一时间是手动调节的,最后还是决定“写个脚本吧……”
靠这个脚本也算解决亮度难题了,尽管不怎么优雅。
标签:控制,AHK2,curLight,cmd,亮度,wmi,static,TRUE From: https://www.cnblogs.com/refiz/p/17582521.html