如何在 Windows 中获得与此 Linux 函数等效的功能:
setxkbmap -option numpad:mac
来自文档:
numpad:mac 数字键盘键始终输入数字(与在 Mac OS 中一样)
这意味着无论是否按下 NumLock 键,也无论 NumLock LED 状态如何,小键盘始终会输入数字,而不是光标移动。
我发现,对于 Windows,最接近的做法是关闭 NumLock 键(使用应用程序或直接使用注册表项键盘布局/“Scancode Map”),但这只会使状态看起来好像我从未按下过 NumLock 键。小键盘模式仍可通过软件更改,在启动时从 BIOS 继承等。
作为“奖励”,我还想关闭 LED。
因此:LED 熄灭,按键输入数字,始终
答案1
我想要类似的行为,并习惯HKLM\...\Keyboard Layout\ScanCodeMap
将顶行数字键的扫描码映射到数字键盘键,因为顶行键不受 状态的影响NumLock
。该重新映射包含在此.reg
文件中:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"ScanCode Map"=hex:00,00,00,00,00,00,00,00,0c,00,00,00,02,00,4f,00,03,00,\
50,00,04,00,51,00,05,00,4b,00,06,00,4c,00,07,00,4d,00,08,00,47,00,09,00,48,\
00,0a,00,49,00,0b,00,52,00,34,00,53,00,00,00,00,00
通过此重新映射,的状态NumLock
没有区别,也没有区别CapsLock
,但如果您按住Shift
键,您将获得与顶行键相关的符号。
如果你关闭NumLock
via InitialKeyboardIndicators
,你可以包括映射Null
扫描码到NumLock
密钥:
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"ScanCode Map"=hex:00,00,00,00,00,00,00,00,0d,00,00,00,02,00,4f,00,03,00,\
50,00,04,00,51,00,05,00,4b,00,06,00,4c,00,07,00,4d,00,08,00,47,00,09,00,48,\
00,0a,00,49,00,0b,00,52,00,34,00,53,00,00,e0,45,e0,00,00,00,00
然后应该防止按下按键时指示灯亮起 NumLock
。(这里没有指示灯,所以无法测试)。它可能仍可以通过软件打开,但这应该涵盖“正常”情况。
合并上述任一.reg
文件后,请注销/登录或重新启动以使更改生效
在旁边:
价值观ScanCodeMap
由此而产生电源外壳脚本。它允许(相对)轻松地编辑扫描代码数组,以根据需要添加和删除重新映射。因为它正在编辑配置单元HKLM
,所以您必须拥有Admin
权限并从行政 电源外壳安慰。
##############################################################
$SimplePairs = @(
0x02, 0x4f # 1 ! > 1 end
0x03, 0x50 # 2 @ > 2 ↓
0x04, 0x51 # 3 # > 3 pg dn
0x05, 0x4b # 4 $ > 4 ←
0x06, 0x4c # 5 % > 5
0x07, 0x4d # 6 ^ > 6 →
0x08, 0x47 # 7 & > 7 home
0x09, 0x48 # 8 * > 8 ↑
0x0a, 0x49 # 9 ( > 9 pg up
0x0b, 0x52 # 0 ) > 0 Ins
0x34, 0x53 # . > > . Del
# 0x00, 0x3a # Null > CapsLock
)
$ExtendedPairs = @(
0x00, 0xe0, 0x45, 0xe0 # Null > NumLock(0xe045)
)
$ByteCount = 2 * $SimplePairs.Length + $ExtendedPairs.Length + 16
$Remap = New-Object -TypeName byte[] -ArgumentList $ByteCount
$Remap.Length
$Remap[8] = $SimplePairs.Length/2 + $ExtendedPairs.Length/4 + 1
For ($i = 0 ; $i -lt $SimplePairs.Length ; $i += 2) {
$Remap[$i * 2 + 12] = $SimplePairs[$i]
$Remap[$i * 2 + 14] = $SimplePairs[$i + 1]
}
For ($i = 0 ; $i -lt $ExtendedPairs.Length ; $i += 4) {
$Offset = $SimplePairs.Length * 2
$Remap[$i + 12 + $Offset] = $ExtendedPairs[$i]
$Remap[$i + 13 + $Offset] = $ExtendedPairs[$i + 1]
$Remap[$i + 14 + $Offset] = $ExtendedPairs[$i + 2]
$Remap[$i + 15 + $Offset] = $ExtendedPairs[$i + 3]
}
$Splat = @{
Path = 'HKLM:\SYSTEM\CurrentControlSet\Control\Keyboard Layout'
Name = 'ScanCode Map'
Value = $Remap
Force = $True
}
$Splat['Value'] | format-hex
New-ItemProperty @Splat
答案2
满足 NumLock 强制器,由昵称“lanux128”的捐赠编码员版主编写。
这是一个自动热键脚本将强制您的 NumLock 始终处于打开状态,无论某些程序是否将其设置为关闭。它通过每 500 毫秒检查一次其状态来实现这一点。
这是脚本(请注意,分号开始注释):
; NumLock Enforcer
; To monitor and switch on the NumLock key
; Date: 01/07/2007 ;Last Updated: 01/07/2007
; Refer: hxxp://www.donationcoder.com/Forums/bb/index.php?topic=9018
; Changes since:
; *****
;
#SingleInstance force
;#NoTrayIcon ;if you don't need a tray icon
#InstallKeybdHook
#Persistent
;Menu, tray, Icon, %A_WinDir%\System32\shell32.dll, 105
appname=NumLock Enforcer
SetTimer, EnforceNumLock, 500
Return
EnforceNumLock:
NumLockStatus := GetKeyState("Numlock", "T")
IfEqual, NumLockStatus, 0
{
SetNumLockState, On
;Uncomment the below line if you want some kind of feedback.
;TrayTip,%appname%,NumLock Status = On,,1
}
Return
;Win+p pauses the script,just in case you need the NumLock.
#p::Pause
;Win+q exits...
#q::ExitApp
安装 AutoHotKey 后,将上述文本放入名为 的文件中
NumLock Enforcer.ahk
,然后双击进行测试。您可以通过右键单击托盘栏中的绿色 H 图标并选择退出来停止脚本。要让它在登录时运行,请将其放在 的启动组中
C:\Users\USER-NAME\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
。