📄 kbdkor.cpp
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this source code is subject to the terms of the Microsoft end-user
// license agreement (EULA) under which you licensed this SOFTWARE PRODUCT.
// If you did not accept the terms of the EULA, you are not authorized to use
// this source code. For a copy of the EULA, please see the LICENSE.RTF on your
// install media.
//
#include <windows.h>
#include <keybddr.h>
#include <laymgr.h>
#include "devicelayout.h"
#include "NumPadRmp.h"
#define ScanCodeTableFirst 0x00
#define ScanCodeTableLast 0x84
static UINT8 ScanCodeToVKeyTable[] =
{
0, // Scan Code 0x0
VK_F9, // Scan Code 0x1
0, // Scan Code 0x2
VK_F5, // Scan Code 0x3
VK_F3, // Scan Code 0x4
VK_F1, // Scan Code 0x5
VK_F2, // Scan Code 0x6
VK_F12, // Scan Code 0x7
0, // Scan Code 0x8
VK_F10, // Scan Code 0x9
VK_F8, // Scan Code 0xA
VK_F6, // Scan Code 0xB
VK_F4, // Scan Code 0xC
VK_TAB, // Scan Code 0xD
VK_BACKQUOTE, // Scan Code 0xE
0, // Scan Code 0xF
0, // Scan Code 0x10
VK_LMENU, // Scan Code 0x11
VK_LSHIFT, // Scan Code 0x12
0, // Scan Code 0x13
VK_LCONTROL, // Scan Code 0x14
'Q', // Scan Code 0x15
'1', // Scan Code 0x16
0, // Scan Code 0x17
0, // Scan Code 0x18
0, // Scan Code 0x19
'Z', // Scan Code 0x1A
'S', // Scan Code 0x1B
'A', // Scan Code 0x1C
'W', // Scan Code 0x1D
'2', // Scan Code 0x1E
0, // Scan Code 0x1F
0, // Scan Code 0x20
'C', // Scan Code 0x21
'X', // Scan Code 0x22
'D', // Scan Code 0x23
'E', // Scan Code 0x24
'4', // Scan Code 0x25
'3', // Scan Code 0x26
0, // Scan Code 0x27
0, // Scan Code 0x28
VK_SPACE, // Scan Code 0x29
'V', // Scan Code 0x2A
'F', // Scan Code 0x2B
'T', // Scan Code 0x2C
'R', // Scan Code 0x2D
'5', // Scan Code 0x2E
0, // Scan Code 0x2F
0, // Scan Code 0x30
'N', // Scan Code 0x31
'B', // Scan Code 0x32
'H', // Scan Code 0x33
'G', // Scan Code 0x34
'Y', // Scan Code 0x35
'6', // Scan Code 0x36
0, // Scan Code 0x37
0, // Scan Code 0x38
0, // Scan Code 0x39
'M', // Scan Code 0x3A
'J', // Scan Code 0x3B
'U', // Scan Code 0x3C
'7', // Scan Code 0x3D
'8', // Scan Code 0x3E
0, // Scan Code 0x3F
0, // Scan Code 0x40
VK_COMMA, // Scan Code 0x41
'K', // Scan Code 0x42
'I', // Scan Code 0x43
'O', // Scan Code 0x44
'0', // Scan Code 0x45
'9', // Scan Code 0x46
0, // Scan Code 0x47
0, // Scan Code 0x48
VK_PERIOD, // Scan Code 0x49
VK_SLASH, // Scan Code 0x4A
'L', // Scan Code 0x4B
VK_SEMICOLON, // Scan Code 0x4C
'P', // Scan Code 0x4D
VK_HYPHEN, // Scan Code 0x4E
0, // Scan Code 0x4F
0, // Scan Code 0x50
0, // Scan Code 0x51
VK_APOSTROPHE, // Scan Code 0x52
0, // Scan Code 0x53
VK_LBRACKET, // Scan Code 0x54
VK_EQUAL, // Scan Code 0x55
0, // Scan Code 0x56
0, // Scan Code 0x57
VK_CAPITAL, // Scan Code 0x58
VK_RSHIFT, // Scan Code 0x59
VK_RETURN, // Scan Code 0x5A
VK_RBRACKET, // Scan Code 0x5B
0, // Scan Code 0x5C
VK_BACKSLASH, // Scan Code 0x5D
0, // Scan Code 0x5E
0, // Scan Code 0x5F
0, // Scan Code 0x60
0, // Scan Code 0x61
0, // Scan Code 0x62
0, // Scan Code 0x63
0, // Scan Code 0x64
0, // Scan Code 0x65
VK_BACK, // Scan Code 0x66
0, // Scan Code 0x67
0, // Scan Code 0x68
VK_NUMPAD1, // Scan Code 0x69
0, // Scan Code 0x6A
VK_NUMPAD4, // Scan Code 0x6B
VK_NUMPAD7, // Scan Code 0x6C
0, // Scan Code 0x6D
0, // Scan Code 0x6E
0, // Scan Code 0x6F
VK_NUMPAD0, // Scan Code 0x70
VK_DECIMAL, // Scan Code 0x71
VK_NUMPAD2, // Scan Code 0x72
VK_NUMPAD5, // Scan Code 0x73
VK_NUMPAD6, // Scan Code 0x74
VK_NUMPAD8, // Scan Code 0x75
VK_ESCAPE, // Scan Code 0x76
VK_NUMLOCK, // Scan Code 0x77
VK_F11, // Scan Code 0x78
VK_ADD, // Scan Code 0x79
VK_NUMPAD3, // Scan Code 0x7A
VK_SUBTRACT, // Scan Code 0x7B
VK_MULTIPLY, // Scan Code 0x7C
VK_NUMPAD9, // Scan Code 0x7D
VK_SCROLL, // Scan Code 0x7E
0, // Scan Code 0x7F
0, // Scan Code 0x80
0, // Scan Code 0x81
0, // Scan Code 0x82
VK_F7, // Scan Code 0x83
VK_SNAPSHOT, // Scan Code 0x84
};
#define ScanCodeTableKorFirst 0xf1
#define ScanCodeTableKorLast 0xf2
static UINT8 ScanCodeToVKeyTableKor[] =
{
VK_HANJA, // Scan Code 0xF1
VK_HANGUL, // Scan Code 0xF2
};
#define E0ScanCodeTableFirst 0xE010
#define E0ScanCodeTableLast 0xE07F
static UINT8 E0ScanCodeToVKeyTable[] =
{
VK_BROWSER_SEARCH, // Scan Code 0xE010
VK_RMENU, // Scan Code 0xE011
0, // Scan Code 0xE012 which must be 0 or extra WM_KEYDOWN/UP messages will occur
0, // Scan Code 0xE013
VK_RCONTROL, // Scan Code 0xE014
VK_MEDIA_PREV_TRACK, // Scan Code 0xE015
0, // Scan Code 0xE016
0, // Scan Code 0xE017
VK_BROWSER_FAVORITES, // Scan Code 0xE018
0, // Scan Code 0xE019
0, // Scan Code 0xE01A
0, // Scan Code 0xE01B
0, // Scan Code 0xE01C
0, // Scan Code 0xE01D
0, // Scan Code 0xE01E
VK_LWIN, // Scan Code 0xE01F
VK_BROWSER_REFRESH, // Scan Code 0xE020
VK_VOLUME_DOWN, // Scan Code 0xE021
0, // Scan Code 0xE022
VK_VOLUME_MUTE, // Scan Code 0xE023
0, // Scan Code 0xE024
0, // Scan Code 0xE025
0, // Scan Code 0xE026
VK_RWIN, // Scan Code 0xE027
VK_BROWSER_STOP, // Scan Code 0xE028
0, // Scan Code 0xE029
0, // Scan Code 0xE02A
VK_LAUNCH_APP2, // Scan Code 0xE02B
0, // Scan Code 0xE02C
0, // Scan Code 0xE02D
0, // Scan Code 0xE02E
VK_APPS, // Scan Code 0xE02F
VK_BROWSER_FORWARD, // Scan Code 0xE030
0, // Scan Code 0xE031
VK_VOLUME_UP, // Scan Code 0xE032
0, // Scan Code 0xE033
VK_MEDIA_PLAY_PAUSE, // Scan Code 0xE034
0, // Scan Code 0xE035
0, // Scan Code 0xE036
0, // Scan Code 0xE037
VK_BROWSER_BACK, // Scan Code 0xE038
0, // Scan Code 0xE039
VK_BROWSER_HOME, // Scan Code 0xE03A
VK_MEDIA_STOP, // Scan Code 0xE03B
0, // Scan Code 0xE03C
0, // Scan Code 0xE03D
0, // Scan Code 0xE03E
VK_OFF, // Scan Code 0xE03F
VK_LAUNCH_APP1, // Scan Code 0xE040
0, // Scan Code 0xE041
0, // Scan Code 0xE042
0, // Scan Code 0xE043
0, // Scan Code 0xE044
0, // Scan Code 0xE045
0, // Scan Code 0xE046
0, // Scan Code 0xE047
VK_LAUNCH_MAIL, // Scan Code 0xE048
0, // Scan Code 0xE049
VK_DIVIDE, // Scan Code 0xE04A
0, // Scan Code 0xE04B
0, // Scan Code 0xE04C
VK_MEDIA_NEXT_TRACK, // Scan Code 0xE04D
0, // Scan Code 0xE04E
0, // Scan Code 0xE04F
VK_LAUNCH_MEDIA_SELECT, // Scan Code 0xE050
0, // Scan Code 0xE051
0, // Scan Code 0xE052
0, // Scan Code 0xE053
0, // Scan Code 0xE054
0, // Scan Code 0xE055
0, // Scan Code 0xE056
0, // Scan Code 0xE057
0, // Scan Code 0xE058
0, // Scan Code 0xE059
VK_RETURN, // Scan Code 0xE05A
0, // Scan Code 0xE05B
0, // Scan Code 0xE05C
0, // Scan Code 0xE05D
0, // Scan Code 0xE05E
0, // Scan Code 0xE05F
0, // Scan Code 0xE060
0, // Scan Code 0xE061
0, // Scan Code 0xE062
0, // Scan Code 0xE063
0, // Scan Code 0xE064
0, // Scan Code 0xE065
0, // Scan Code 0xE066
0, // Scan Code 0xE067
0, // Scan Code 0xE068
VK_END, // Scan Code 0xE069
0, // Scan Code 0xE06A
VK_LEFT, // Scan Code 0xE06B
VK_HOME, // Scan Code 0xE06C
0, // Scan Code 0xE06D
0, // Scan Code 0xE06E
0, // Scan Code 0xE06F
VK_INSERT, // Scan Code 0xE070
VK_DELETE, // Scan Code 0xE071
VK_DOWN, // Scan Code 0xE072
0, // Scan Code 0xE073
VK_RIGHT, // Scan Code 0xE074
VK_UP, // Scan Code 0xE075
0, // Scan Code 0xE076
0, // Scan Code 0xE077
0, // Scan Code 0xE078
0, // Scan Code 0xE079
VK_NEXT, // Scan Code 0xE07A
0, // Scan Code 0xE07B
VK_SNAPSHOT, // Scan Code 0xE07C
VK_PRIOR, // Scan Code 0xE07D
VK_CANCEL, // Scan Code 0xE07E
0, // Scan Code 0xE07F
};
#define E1ScanCodeTableFirst 0xE11477
#define E1ScanCodeTableLast 0xE11477
static UINT8 E1ScanCodeToVKeyTable[] =
{
VK_PAUSE, // Scan Code 0xE11477
};
static ScanCodeToVKeyData scvkKor =
{
0,
ScanCodeTableFirst,
ScanCodeTableLast,
ScanCodeToVKeyTable
};
static ScanCodeToVKeyData scvkKor2 =
{
0,
ScanCodeTableKorFirst,
ScanCodeTableKorLast,
ScanCodeToVKeyTableKor
};
static ScanCodeToVKeyData scvkE0Kor =
{
0xE000,
E0ScanCodeTableFirst,
E0ScanCodeTableLast,
E0ScanCodeToVKeyTable
};
static ScanCodeToVKeyData scvkE1Kor =
{
0xE10000,
E1ScanCodeTableFirst,
E1ScanCodeTableLast,
E1ScanCodeToVKeyTable
};
static ScanCodeToVKeyData *rgscvkATKorTables[] =
{ &scvkKor, &scvkKor2, &scvkE0Kor, &scvkE1Kor };
//-----------------------------------------------------------------------------
// Remapping functions
#define IsShiftModifier(x) ((x) == VK_LSHIFT || (x) == VK_RSHIFT || \
(x) == VK_LCONTROL || (x) == VK_RCONTROL || (x) == VK_LMENU || (x) == VK_RMENU || \
(x) == VK_LWIN || (x) == VK_RWIN)
static
UINT
WINAPI
ATKorRemapVKey(
const KEYBD_EVENT *pKbdEvents,
UINT cKbdEvents,
KEYBD_EVENT *pRmpKbdEvents,
UINT cMaxRmpKbdEvents
)
{
UINT cRmpKbdEvents;
if (pRmpKbdEvents == NULL) {
// 1 to 1 mapping for whatever NumPadRemapVKey returns
ASSERT(cMaxRmpKbdEvents == 0);
return NumPadRemapVKey(pKbdEvents, cKbdEvents, NULL, 0);
}
ASSERT(pKbdEvents != NULL);
// We know that we will only map one input to one output. Thus, we only
// need for NumPadRemapVKey() to check the number of input events since
// we will not use more than it does. If the buffer is not large enough
// cRmpKbdEvents will be 0 and we will return 0.
cRmpKbdEvents = NumPadRemapVKey(pKbdEvents, cKbdEvents,
pRmpKbdEvents, cMaxRmpKbdEvents);
for (UINT ui = 0; ui < cRmpKbdEvents; ++ui)
{
if (pRmpKbdEvents[ui].KeyStateFlags & KeyStateDownFlag) {
UINT32 vkOnly = pRmpKbdEvents[ui].uiVk & 0xff;
// If the incoming key is a shift modifier of some sort, turn off keyclick autorepeat by default.
// We will allow the shift key to click on the first press, since many keyboards don't have built-in
// sound generators and users appreciate audible feedback when they press a key.
if(IsShiftModifier(vkOnly) || vkOnly == VK_CAPITAL || vkOnly == VK_NUMLOCK) {
pRmpKbdEvents[ui].uiVk |= KEYBD_DEVICE_SILENT_REPEAT;
}
}
}
return cRmpKbdEvents;
}
#ifdef DEBUG
// Verify function declaration against the typedef.
static PFN_KEYBD_REMAP v_pfnATKorRemapVKey = ATKorRemapVKey;
#endif
static DEVICE_LAYOUT dlATKor =
{
sizeof(DEVICE_LAYOUT),
PS2_AT_PDD | PS2_NOP_PDD,
rgscvkATKorTables,
dim(rgscvkATKorTables),
ATKorRemapVKey,
};
extern "C"
BOOL
PS2_AT_00000412(
PDEVICE_LAYOUT pDeviceLayout
)
{
PREFAST_ASSERT(pDeviceLayout != NULL);
BOOL fRet = FALSE;
if (pDeviceLayout->dwSize != sizeof(DEVICE_LAYOUT)) {
RETAILMSG(1, (_T("PS2_AT_00000412: data structure size mismatch\r\n")));
goto leave;
}
// Make sure that the Sc->Vk tables are the sizes that we expect
ASSERT(dim(ScanCodeToVKeyTable ) == (1 + ScanCodeTableLast - ScanCodeTableFirst ));
ASSERT(dim(E0ScanCodeToVKeyTable) == (1 + E0ScanCodeTableLast - E0ScanCodeTableFirst));
ASSERT(dim(E1ScanCodeToVKeyTable) == (1 + E1ScanCodeTableLast - E1ScanCodeTableFirst));
*pDeviceLayout = dlATKor;
fRet = TRUE;
leave:
return fRet;
}
#ifdef DEBUG
// Verify function declaration against the typedef.
static PFN_DEVICE_LAYOUT_ENTRY v_pfnDeviceLayoutPS2_AT = PS2_AT_00000412;
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -