Fn按鍵失靈后的軟件替代方案


環境: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,速度快多了。也就是目前可用的版本了

 

延伸思考

  1. wmi可以監聽進程的創建、退出消息。這個可以做啟動客戶端后,自動啟動后台服務、停止服務的功能,而優化電腦的性能

  2. autohotkey可以根據窗口的標題來執行動作,那么可以去掉win7桌面的刪除文件時的確認窗口


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM