如何让 Windows 中的数字键盘键始终输入数字?

如何让 Windows 中的数字键盘键始终输入数字?

如何在 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键,您将获得与顶行键相关的符号。

如果你关闭NumLockvia 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

相关内容