在Windows 8中,我曾经重新映射了capslock键以使用注册表脚本进行控制
REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00
升级到窗口10后,此功能不再起作用。如何做呢?
在Windows 8中,我曾经重新映射了capslock键以使用注册表脚本进行控制
REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00
升级到窗口10后,此功能不再起作用。如何做呢?
Answers:
您还记得重新启动吗?似乎对我来说很好,就像在7和8中一样。
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,02,00,00,00,1d,00,3a,00,00,00,00,00
.reg
扩展名,双击该文件以将更改应用于注册表,然后重新启动。
Caps Lock
回事后?
如果有人需要通过PowerShell完成此操作:
$hexified = "00,00,00,00,00,00,00,00,02,00,00,00,1d,00,3a,00,00,00,00,00".Split(',') | % { "0x$_"};
$kbLayout = 'HKLM:\System\CurrentControlSet\Control\Keyboard Layout';
New-ItemProperty -Path $kbLayout -Name "Scancode Map" -PropertyType Binary -Value ([byte[]]$hexified);
以管理员身份运行并重新启动。
我使用以下命令将CTRL发送给CAPS LOCK键,将ALT发送给CTRL键,并将CAPS LOCK发送给ALT键。CTRL在上帝所希望的“ A”左侧,ALT在“ SHIFT”下方,并且完全没用的CAPS LOCK键安全地藏在必须折断手腕才能击中的位置。
Windows Registry Editor Version 5.00
; The hex data is in five groups of four bytes:
; 00,00,00,00,\ header version (always 00000000)
; 00,00,00,00,\ header flags (always 00000000)
; 04,00,00,00,\ # of entries (3 in this case) plus a NULL terminator line.
; Entries are in 2-byte pairs: Key code to send & keyboard key to send it.
; Each entry is in LSB, MSB order.
; 1d,00,3a,00,\ Send LEFT CTRL (0x001d) code when user presses the CAPS LOCK key (0x003a)
; 38,00,1d,00,\ Send LEFT ALT (0x0038) code when user presses the LEFT CTRL key (0x001d)
; 3a,00,38,00,\ Send CAPS LOCK (0x3A) code when user presses the LEFT ALT key (0x0038)
; 00,00,00,00 NULL terminator
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,\
00,00,00,00,\
04,00,00,00,\
1d,00,3a,00,\
38,00,1d,00,\
3a,00,38,00,\
00,00,00,00
我曾经使用AutoHotKey来做到这一点。
我会在启动目录中有一个链接来运行一个非常基本的ahk脚本:
Capslock::Ctrl
问题是,Autohotkey不会以管理员身份运行,因此不会影响特权窗口,除非您使用任务计划程序而不是启动目录在登录时以更高的特权运行脚本。第二个问题是,有时,脚本在恢复睡眠时会挂起,因此您可能需要重新加载它,这很烦人。
AutoHotKey更适合于更复杂的任务,例如编写宏。
如果由于某种原因您不想运行第三方工具,则可以自己用一点C来完成。由于Susam Pal 出色的回答,我将下面的代码片段放在一起。
它实际上是一个按键记录器。它侦听按键,捕获按键,并在考虑映射的情况下构造键盘输入。下面的控制台应用程序需要运行才能运行。
您将需要以某种方式进行编译。我将msys2.org与pacman -S mingw-w64-x86_64-gcc
和一起使用/mingw64/bin/gcc nocaps.c -o nocaps.exe
。
#include <stdio.h>
#include <windows.h>
HHOOK hook;
#define KEYCODE_CAPSLOCK 20
#define KEYCODE_LCTRL 162
LRESULT CALLBACK keyboardHook(int nCode, WPARAM wParam, LPARAM lParam)
{
KBDLLHOOKSTRUCT *p = (KBDLLHOOKSTRUCT *) lParam;
INPUT input = {.type = INPUT_KEYBOARD };
printf("nCode=%d\t wParam=%d\t p->vkCode=%lu \t p->scanCode=%d\t\n", nCode, wParam, p->vkCode, p->scanCode);
if (wParam == WM_KEYUP || wParam == WM_SYSKEYUP) {
input.ki.dwFlags = KEYEVENTF_KEYUP;
}
if (p->vkCode == KEYCODE_CAPSLOCK && (p->flags & LLKHF_INJECTED) == 0) {
input.ki.wVk = KEYCODE_LCTRL;
SendInput(1, &input, sizeof (INPUT));
return 1;
} else if (p->vkCode == KEYCODE_LCTRL && (p->flags & LLKHF_INJECTED) == 0) {
input.ki.wVk = KEYCODE_CAPSLOCK;
SendInput(1, &input, sizeof (INPUT));
return 1;
}
return CallNextHookEx(hook, nCode, wParam, lParam);
}
int main(int argc, char **argv)
{
MSG messages;
hook = SetWindowsHookEx(WH_KEYBOARD_LL, keyboardHook, NULL, 0);
if (hook == NULL) {
printf("Error %d\n", GetLastError());
return 1;
}
printf("Mapping CAPSLOCK=>LCTRL and LCTRL=>CAPSLOCK..\n");
while (GetMessage (&messages, NULL, 0, 0))
{
TranslateMessage(&messages);
DispatchMessage(&messages);
}
return 0;
}