使用 MSKLC 更改键盘布局时,键盘快捷键无效

Wes*_*Gun 5 keyboard-shortcuts keyboard-layout

在 Windows 10 中,我使用Microsoft 键盘布局创建器来更改我的键盘布局,因此我的一半键更改了位置。

但是现在,我软件中的所有键盘快捷键都不起作用。例如,现在在P钥匙所在的位置,有O. 在 Eclipse 中,当我按 Ctrl+O 打开一个方法时,Eclipse 认为我在按 Ctrl+P,所以它会提示我打印对话框。

在 MS 网站上,我读到了这个:

https://msdn.microsoft.com/en-us/library/windows/desktop/gg153546(v=vs.85).aspx

另外,避免使用 WM_CHAR 来实现键盘快捷键。相反,使用 WM_KEYDOWN 消息;或者甚至更好,使用加速器表。加速器表在下一主题加速器表中描述。

所以,当我改变键盘布局时,我改变了每个键的字符,但我没有改变虚拟键代码,所以这搞砸了。这同样适用于 IME(输入法),如微软拼音。现在,使用新的键盘布局,我无法,使用..

现在它变得可以理解,同时保持不合理。

我认为必须有一个解决方案,因为我认为我面临着与任何想要使用 Dvorak 或 AZERTY 或任何其他键盘布局的用户相同的问题。

我们如何解决这个问题?

Wes*_*Gun 6

我在这里发现了另一个非常相关的问题:

\n\n

如何在 Microsoft Keyboard Layout Creator 中恢复 Ctrl+<key> 功能?

\n\n

,有一个完美的答案。我将尝试扩展它的细节并将其作为副本放在这里。

\n\n

答案提到通过.klc直接在文本编辑器中编辑文件来更改每个键的VK代码,这是我没有想到的,令人惊叹的设计。它还包含一个博客链接,显示如何执行此操作:

\n\n

www.sensefulsolutions.com/2010/08/how-to-fix-keyboard-shortcuts-in-klc-eg.html

\n\n

那么让我们这样说吧:

\n\n

Windows 中每个应用程序中的快捷键并不直接绑定到每个键的字符输出。它们绑定到每个键的虚拟键代码。按键的扫描码是特定于硬件的。驱动程序将这些代码转换为虚拟按键代码,然后操作系统接收VK代码来执行任务。

\n\n

当我们在 MSKLC 中编辑键盘布局时,默认情况下 VK 代码不会更改。但您可以打开该.klc文件进行编辑。

\n\n

一个典型的.klc文件将是这样的:

\n\n
KBD WT_VK_CN    "WindThunder VK code changed - Simplified Chinese"\n\nCOPYRIGHT   "(c) 2017 WindThunder Studio"\n\nCOMPANY "WindThunder Studio"\n\nLOCALENAME  "zh-CN"\n\nLOCALEID    "00000804"\n\nVERSION 1.0\n\nSHIFTSTATE\n\n0   //Column 4\n1   //Column 5 : Shft\n2   //Column 6 :       Ctrl\n6   //Column 7 :       Ctrl Alt\n7   //Column 8 : Shft  Ctrl Alt\n\nLAYOUT      ;an extra \'@\' at the end is a dead key\n\n//SC    VK_     Cap   0     1        2   6       7\n//----------------------------------------------------------------------------------------------------------------------------\n\n02  1           1   007b    1       -1  -1      -1      // LEFT CURLY BRACKET, DIGIT ONE, <none>, <none>, <none>\n03  2           1   005b    2       -1  00b7    -1      // LEFT SQUARE BRACKET, DIGIT TWO, <none>, MIDDLE DOT, <none>\n04  3           1   0028    3       -1  20ac    -1      // LEFT PARENTHESIS, DIGIT THREE, <none>, EURO SIGN, <none>\n05  4           1   003c    4       -1  -1      -1      // LESS-THAN SIGN, DIGIT FOUR, <none>, <none>, <none>\n06  5           1   002f    5       -1  -1      -1      // SOLIDUS, DIGIT FIVE, <none>, <none>, <none>\n07  OEM_7       0   0027    0022    -1  00a8@   -1      // APOSTROPHE, QUOTATION MARK, <none>, DIAERESIS, <none>\n08  6           1   005c    6       -1  00ac    -1      // REVERSE SOLIDUS, DIGIT SIX, <none>, NOT SIGN, <none>\n09  7           1   003e    7       -1  -1      -1      // GREATER-THAN SIGN, DIGIT SEVEN, <none>, <none>, <none>\n0a  8           1   0029    8       -1  -1      -1      // RIGHT PARENTHESIS, DIGIT EIGHT, <none>, <none>, <none>\n0b  9           1   005d    9       -1  -1      -1      // RIGHT SQUARE BRACKET, DIGIT NINE, <none>, <none>, <none>\n0c  0           1   007d    0       -1  00a1    -1      // RIGHT CURLY BRACKET, DIGIT ZERO, <none>, INVERTED EXCLAMATION MARK, <none>\n0d  OEM_PLUS    0   003d    002b    -1  00bf    -1      // EQUALS SIGN, PLUS SIGN, <none>, INVERTED QUESTION MARK, <none>\n10  Q           1   q       Q       -1  -1      -1      // LATIN SMALL LETTER Q, LATIN CAPITAL LETTER Q, <none>, <none>, <none>\n11  W           1   w       W       -1  -1      -1      // LATIN SMALL LETTER W, LATIN CAPITAL LETTER W, <none>, <none>, <none>\n12  E           1   e       E       -1  -1      -1      // LATIN SMALL LETTER E, LATIN CAPITAL LETTER E, <none>, <none>, <none>\n13  R           1   r       R       -1  -1      -1      // LATIN SMALL LETTER R, LATIN CAPITAL LETTER R, <none>, <none>, <none>\n14  T           1   t       T       -1  -1      -1      // LATIN SMALL LETTER T, LATIN CAPITAL LETTER T, <none>, <none>, <none>\n15  OEM_6       0   0060    005e    -1  00b4@   -1      // GRAVE ACCENT, CIRCUMFLEX ACCENT, <none>, ACUTE ACCENT, <none>\n16  Y           1   y       Y       -1  -1      -1      // LATIN SMALL LETTER Y, LATIN CAPITAL LETTER Y, <none>, <none>, <none>\n17  U           1   u       U       -1  -1      -1      // LATIN SMALL LETTER U, LATIN CAPITAL LETTER U, <none>, <none>, <none>\n18  I           1   i       I       -1  -1      -1      // LATIN SMALL LETTER I, LATIN CAPITAL LETTER I, <none>, <none>, <none>\n19  O           1   o       O       -1  -1      -1      // LATIN SMALL LETTER O, LATIN CAPITAL LETTER O, <none>, <none>, <none>\n1a  P           1   p       P       -1  -1      -1      // LATIN SMALL LETTER P, LATIN CAPITAL LETTER P, <none>, <none>, <none>\n1b  OEM_MINUS   0   0025    0040    -1  -1      -1      // PERCENT SIGN, COMMERCIAL AT, <none>, <none>, <none>\n1e  A           1   a       A       -1  -1      -1      // LATIN SMALL LETTER A, LATIN CAPITAL LETTER A, <none>, <none>, <none>\n1f  S           1   s       S       -1  -1      -1      // LATIN SMALL LETTER S, LATIN CAPITAL LETTER S, <none>, <none>, <none>\n20  D           1   d       D       -1  -1      -1      // LATIN SMALL LETTER D, LATIN CAPITAL LETTER D, <none>, <none>, <none>\n21  F           1   f       F       -1  -1      -1      // LATIN SMALL LETTER F, LATIN CAPITAL LETTER F, <none>, <none>, <none>\n22  G           1   g       G       -1  -1      -1      // LATIN SMALL LETTER G, LATIN CAPITAL LETTER G, <none>, <none>, <none>\n23  OEM_4       0   002d    005f    -1  -1      -1      // HYPHEN-MINUS, LOW LINE, <none>, <none>, <none>\n24  H           1   h       H       -1  -1      -1      // LATIN SMALL LETTER H, LATIN CAPITAL LETTER H, <none>, <none>, <none>\n25  J           1   j       J       -1  -1      -1      // LATIN SMALL LETTER J, LATIN CAPITAL LETTER J, <none>, <none>, <none>\n26  K           1   k       K       -1  -1      -1      // LATIN SMALL LETTER K, LATIN CAPITAL LETTER K, <none>, <none>, <none>\n27  L           1   l       L       -1  -1      -1      // LATIN SMALL LETTER L, LATIN CAPITAL LETTER L, <none>, <none>, <none>\n28  OEM_1       4   003b    003a    -1  00f1    00d1    // SEMICOLON, COLON, <none>, LATIN SMALL LETTER N WITH TILDE, LATIN CAPITAL LETTER N WITH TILDE\n29  OEM_2       0   003f    0021    -1  00ba    00aa    // QUESTION MARK, EXCLAMATION MARK, <none>, MASCULINE ORDINAL INDICATOR, FEMININE ORDINAL INDICATOR\n2b  OEM_5       4   007c    0024    -1  00e7    00c7    // VERTICAL LINE, DOLLAR SIGN, <none>, LATIN SMALL LETTER C WITH CEDILLA, LATIN CAPITAL LETTER C WITH CEDILLA\n2c  Z           1   z       Z       -1  -1      -1      // LATIN SMALL LETTER Z, LATIN CAPITAL LETTER Z, <none>, <none>, <none>\n2d  X           1   x       X       -1  -1      -1      // LATIN SMALL LETTER X, LATIN CAPITAL LETTER X, <none>, <none>, <none>\n2e  C           1   c       C       -1  -1      -1      // LATIN SMALL LETTER C, LATIN CAPITAL LETTER C, <none>, <none>, <none>\n2f  V           1   v       V       -1  -1      -1      // LATIN SMALL LETTER V, LATIN CAPITAL LETTER V, <none>, <none>, <none>\n30  B           1   b       B       -1  -1      -1      // LATIN SMALL LETTER B, LATIN CAPITAL LETTER B, <none>, <none>, <none>\n31  OEM_3       0   007e    0026    -1  -1      -1      // TILDE, AMPERSAND, <none>, <none>, <none>\n32  N           1   n       N       -1  -1      -1      // LATIN SMALL LETTER N, LATIN CAPITAL LETTER N, <none>, <none>, <none>\n33  M           1   m       M       -1  -1      -1      // LATIN SMALL LETTER M, LATIN CAPITAL LETTER M, <none>, <none>, <none>\n34  OEM_COMMA   0   002c    0023    -1  -1      -1      // COMMA, NUMBER SIGN, <none>, <none>, <none>\n35  OEM_PERIOD  0   002e    002a    -1  -1      -1      // FULL STOP, ASTERISK, <none>, <none>, <none>\n39  SPACE       0   0020    0020    -1  -1      -1      // SPACE, SPACE, <none>, <none>, <none>\n53  DECIMAL     0   002e    002e    -1  -1      -1      // FULL STOP, FULL STOP, , , \n\n\nDEADKEY 00a8\n\n0061    00e4    // a -> \xc3\xa4\n0065    00eb    // e -> \xc3\xab\n0069    00ef    // i -> \xc3\xaf\n006f    00f6    // o -> \xc3\xb6\n0075    00fc    // u -> \xc3\xbc\n0041    00c4    // A -> \xc3\x84\n0045    00cb    // E -> \xc3\x8b\n0049    00cf    // I -> \xc3\x8f\n004f    00d6    // O -> \xc3\x96\n0055    00dc    // U -> \xc3\x9c\n0079    00ff    // y -> \xc3\xbf\n0020    00a8    //   -> \xc2\xa8\n\nDEADKEY 00b4\n\n0061    00e1    // a -> \xc3\xa1\n0065    00e9    // e -> \xc3\xa9\n0069    00ed    // i -> \xc3\xad\n006f    00f3    // o -> \xc3\xb3\n0075    00fa    // u -> \xc3\xba\n0079    00fd    // y -> \xc3\xbd\n0041    00c1    // A -> \xc3\x81\n0045    00c9    // E -> \xc3\x89\n0049    00cd    // I -> \xc3\x8d\n004f    00d3    // O -> \xc3\x93\n0055    00da    // U -> \xc3\x9a\n0059    00dd    // Y -> \xc3\x9d\n0020    00b4    //   -> \xc2\xb4\n\n\nKEYNAME\n\n01  Esc\n0e  Backspace\n0f  Tab\n1c  Enter\n1d  Ctrl\n2a  Shift\n36  "Right Shift"\n37  "Num *"\n38  Alt\n39  Space\n3a  "Caps Lock"\n3b  F1\n3c  F2\n3d  F3\n3e  F4\n3f  F5\n40  F6\n41  F7\n42  F8\n43  F9\n44  F10\n45  Pause\n46  "Scroll Lock"\n47  "Num 7"\n48  "Num 8"\n49  "Num 9"\n4a  "Num -"\n4b  "Num 4"\n4c  "Num 5"\n4d  "Num 6"\n4e  "Num +"\n4f  "Num 1"\n50  "Num 2"\n51  "Num 3"\n52  "Num 0"\n53  "Num Del"\n54  "Sys Req"\n57  F11\n58  F12\n7c  F13\n7d  F14\n7e  F15\n7f  F16\n80  F17\n81  F18\n82  F19\n83  F20\n84  F21\n85  F22\n86  F23\n87  F24\n\nKEYNAME_EXT\n\n1c  "Num Enter"\n1d  "Right Ctrl"\n35  "Num /"\n37  "Prnt Scrn"\n38  "Right Alt"\n45  "Num Lock"\n46  Break\n47  Home\n48  Up\n49  "Page Up"\n4b  Left\n4d  Right\n4f  End\n50  Down\n51  "Page Down"\n52  Insert\n53  Delete\n54  <00>\n56  Help\n5b  "Left Windows"\n5c  "Right Windows"\n5d  Application\n\nKEYNAME_DEAD\n\n00a8    "DIAERESIS"\n00b4    "ACUTE ACCENT"\n\n\nDESCRIPTIONS\n\n0409    WindThunder VK code changed - Simplified Chinese\n\nLANGUAGENAMES\n\n0409    Chinese (People\'s Republic of China)\n\nENDKBD\n
Run Code Online (Sandbox Code Playgroud)\n\n

请参阅下面包含 的行layout。你说的是一个表格,其中包含按键及其 VK 代码的映射行以及按下它们时我们得到的字符输出。我们想做的是改变第二列,VK_以使其适应角色,或者根据您的意愿更改它们。验证错误(如果有)将在稍后显示,因此不必担心犯错误。

\n\n

在此更改版本之前,该行:

\n\n
19  O           1   o       O       -1  -1      -1      // LATIN SMALL LETTER O, LATIN CAPITAL LETTER O, <none>, <none>, <none>\n
Run Code Online (Sandbox Code Playgroud)\n\n

曾是:

\n\n
19  P           1   o       O       -1  -1      -1      // LATIN SMALL LETTER O, LATIN CAPITAL LETTER O, <none>, <none>, <none>\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,在我的布局中的位置O,它被解释为VK_P,这就是我收到打印提示的原因。

\n\n

完整的值列表VK_如下:

\n\n

https://msdn.microsoft.com/en-us/library/windows/desktop/dd375731%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396

\n