環境:windows
前言
筆記本的Fn鍵失靈了,雖然電腦自帶了Fn與Ctrl鍵切換的功能,但為了使用Fn而犧牲左邊的Ctrl鍵,簡直不可接受。Fn提供的功能也是我適應白天和晚上不能缺少的功能。
網友們說這種情況可能拆下鍵盤,清理下金手指就好了,但一來麻煩,二來不一定能好。
實現
要替代Fn的組合鍵,就要設置快捷鍵,而windows下設置快捷鍵最方便的工具莫過於autohotkey了。而且可以發送按鍵,直接發送Fn+F5不就可以調整亮度了嗎,so easy! 分分鍾搞定!
然而,現實很殘酷!Fn的按鍵沒有相應的編碼?!而且抓取不到!且各硬件廠家的實現不一?
好吧,換個思路?能調整屏幕亮度就成!找到可使用wmi來調整屏幕亮度,powershell的代碼如下:
::將屏幕的亮度設置為50,最小值為0,最大值為100 (Get-WmiObject -Namespace root/WMI -Class WmiMonitorBrightnessMethods).WmiSetBrightness(1,50) ::獲取當前屏幕亮度 (Get-Ciminstance -Namespace root/WMI -ClassName WmiMonitorBrightness).CurrentBrightness
vbscript的代碼如下:
' 將屏幕的亮度設置為50,最小值為0,最大值為100
On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\wmi")
Set colItems = objWMIService.ExecQuery("Select * from WmiMonitorBrightnessMethods",,48)
For Each objItem in colItems
objItem.WmiSetBrightness(1, 50)
WScript.Echo ""
Next
'獲取當前屏幕亮度
On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\wmi")
Set colItems = objWMIService.ExecQuery("Select * from WmiMonitorBrightness",,48)
For Each objItem in colItems
WScript.Echo "CurrentBrightness: " & objItem.CurrentBrightness
WScript.Echo ""
Next
轉化為Autohotkey后的代碼如下:
;設置屏幕亮度
SetBrightNess(iSetBrigthNess)
{
iSetBrigthNess := Min(100, iSetBrigthNess) ;不大於100
iSetBrigthNess := Max(0, iSetBrigthNess) ; 不小於0
strComputer := "."
objWMIService := ComObjGet("winmgmts:\\" . strComputer . "\root\wmi")
colItems := objWMIService.ExecQuery("Select * from WmiMonitorBrightnessMethods", ComObjMissing(), 48)
For objItem in colItems {
objItem.WmiSetBrightness(1, iSetBrigthNess)
}
return iSetBrigthNess
}
;獲取屏幕亮度
GetCurBrightNess()
{
strComputer := "."
objWMIService := ComObjGet("winmgmts:\\" . strComputer . "\root\wmi")
colItems := objWMIService.ExecQuery("Select * from WmiMonitorBrightness", ComObjMissing(), 48)
iCurrentBrightness := 0
For objItem in colItems {
;~ MsgBox, % "-----------------------------------"
;~ . "Win32_OperatingSystem instance"
;~ . "-----------------------------------"
;~ . "Caption: " . objItem.CurrentBrightness
iCurrentBrightness := objItem.CurrentBrightness
}
return iCurrentBrightness
}
完整的Autohotkey代碼如下:
;Alt+LCtrl+F1 靜音
!>^F1::Send {Volume_Mute}
;Alt+LCtrl+F2 降低音量
!>^F2::Send {Volume_Down}
;Alt+LCtrl+F3 增加音量
!>^F3::Send {Volume_Up}
;Alt+LCtrl+Left 上一首
!>^Left::Send {Media_Prev}
;Alt+LCtrl+Down 暫停、播放
!>^Down::Send {Media_Play_Pause}
;Alt+LCtrl+Right 下一首
!>^Right::Send {Media_Next}
;Alt+LCtrl+Up 停止
!>^Up::Send {Media_Stop}
!>^F5::
result := GetCurBrightNess()
--result
;~ MsgBox % "Result: " --result
SetBrightNess(result)
return
;Alt+LCtrl+F6 增加亮度
!>^F6::
result := GetCurBrightNess()
++result
SetBrightNess(result)
return
;Alt+LCtrl+ESC 退出程度
!>^Esc::ExitApp
;獲取屏幕亮度
GetCurBrightNess()
{
strComputer := "."
objWMIService := ComObjGet("winmgmts:\\" . strComputer . "\root\wmi")
colItems := objWMIService.ExecQuery("Select * from WmiMonitorBrightness", ComObjMissing(), 48)
iCurrentBrightness := 0
For objItem in colItems {
;~ MsgBox, % "-----------------------------------"
;~ . "Win32_OperatingSystem instance"
;~ . "-----------------------------------"
;~ . "Caption: " . objItem.CurrentBrightness
iCurrentBrightness := objItem.CurrentBrightness
}
return iCurrentBrightness
}
;設置屏幕亮度
SetBrightNess(iSetBrigthNess)
{
iSetBrigthNess := Min(100, iSetBrigthNess) ;不大於100
iSetBrigthNess := Max(0, iSetBrigthNess) ; 不小於0
strComputer := "."
objWMIService := ComObjGet("winmgmts:\\" . strComputer . "\root\wmi")
colItems := objWMIService.ExecQuery("Select * from WmiMonitorBrightnessMethods", ComObjMissing(), 48)
For objItem in colItems {
objItem.WmiSetBrightness(1, iSetBrigthNess)
}
return iSetBrigthNess
}
參考資料:
1. https://docs.microsoft.com/zh-cn/windows/desktop/WmiSdk/calling-a-method 告訴了我在autohotkey中可以使用
"
objItem.WmiSetBrightness(1, iSetBrigthNess)
"來調用WmiSetBtightness()的函數,此前使用別的方式調用,返回了錯誤信息0x8004102F
2. http://www.yfvb.com/help/wmi/index.htm?page=wmi_error_constants.htm wmi編程手冊,中文版,可以先學習下基礎知識
3. https://docs.microsoft.com/zh-cn/windows/desktop/WmiSdk/swbemservicesex-put 對工具的幫助不是很大,但有個印象
4. https://docs.microsoft.com/zh-cn/windows/desktop/WmiSdk/creating-a-wmi-script 基礎知識,了解了解
5.https://docs.microsoft.com/zh-cn/windows/desktop/WmiSdk/swbemobject 基礎知識,了解了解
6.https://blog.csdn.net/ONE_SIX_MIX/article/details/80286421 對本文的幫助非常大,這個是c++的解決方案,但我一來不想安裝vs2017,二來還有可以直接發送按鍵就能實現一部分功能,而這些,在c++中不清楚如何處理,想盡快搞個可用的工具。
7.https://www.jianshu.com/p/41206522387b 對本工具的幫助也非常大,之前只找到了powershell版本的可用代碼,在autohotkey中調用powershell,來實現功能,可實際證明,這樣太慢了,實在不好用,學習了這個以后直接在腳本中調用wmi,速度快多了。也就是目前可用的版本了
延伸思考
-
wmi可以監聽進程的創建、退出消息。這個可以做啟動客戶端后,自動啟動后台服務、停止服務的功能,而優化電腦的性能
-
autohotkey可以根據窗口的標題來執行動作,那么可以去掉win7桌面的刪除文件時的確認窗口
