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的代码如下:

1
2
3
4
5
6
7
8
9
10
' 将屏幕的亮度设置为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
1
2
3
4
5
6
7
8
9
10
'获取当前屏幕亮度
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后的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
;设置屏幕亮度
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
;获取屏幕亮度
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代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
;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中可以使用
"

1
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桌面的删除文件时的确认窗口

posted @   小AT  阅读(2203)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示