📄 scvkxtmsjpn1.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.
//
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
@doc EXTERNAL
@module sctovk.cpp |
Sample implementation of the keyboard platform dependent scan code to
Virtual Key mapping for keyboard driver.
Exports ScanCodeToVKey for the PDD to use to map scan codes to virtual
keys. A version of this will be needed for every physical/virtual key
configuration.
*/
#include <windows.h>
#include <keybddr.h>
#define PROFILE 1
#ifdef PROFILE
#include <profiler.h>
#endif
#define ScanCodeTableLast 0x7f
const UINT8 ScanCodeToVKeyTable[ScanCodeTableLast+1] =
{
0, // Scan Code 0x0
VK_ESCAPE, // Scan Code 0x1
'1', // Scan Code 0x2
'2', // Scan Code 0x3
'3', // Scan Code 0x4
'4', // Scan Code 0x5
'5', // Scan Code 0x6
'6', // Scan Code 0x7
'7', // Scan Code 0x8
'8', // Scan Code 0x9
'9', // Scan Code 0xA
'0', // Scan Code 0xB
VK_HYPHEN, // Scan Code 0xC
VK_EQUAL, // Scan Code 0xD
VK_BACK, // Scan Code 0xE
VK_TAB, // Scan Code 0xF
'Q', // Scan Code 0x10
'W', // Scan Code 0x11
'E', // Scan Code 0x12
'R', // Scan Code 0x13
'T', // Scan Code 0x14
'Y', // Scan Code 0x15
'U', // Scan Code 0x16
'I', // Scan Code 0x17
'O', // Scan Code 0x18
'P', // Scan Code 0x19
VK_LBRACKET, // Scan Code 0x1A
VK_RBRACKET, // Scan Code 0x1B
VK_RETURN, // Scan Code 0x1C
VK_LCONTROL, // Scan Code 0x1D
'A', // Scan Code 0x1E
'S', // Scan Code 0x1F
'D', // Scan Code 0x20
'F', // Scan Code 0x21
'G', // Scan Code 0x22
'H', // Scan Code 0x23
'J', // Scan Code 0x24
'K', // Scan Code 0x25
'L', // Scan Code 0x26
VK_SEMICOLON, // Scan Code 0x27
VK_APOSTROPHE, // Scan Code 0x28
VK_BACKQUOTE, // Scan Code 0x29
VK_LSHIFT, // Scan Code 0x2A
VK_BACKSLASH, // Scan Code 0x2B
'Z', // Scan Code 0x2C
'X', // Scan Code 0x2D
'C', // Scan Code 0x2E
'V', // Scan Code 0x2F
'B', // Scan Code 0x30
'N', // Scan Code 0x31
'M', // Scan Code 0x32
VK_COMMA, // Scan Code 0x33
VK_PERIOD, // Scan Code 0x34
VK_SLASH, // Scan Code 0x35
VK_RSHIFT, // Scan Code 0x36
VK_MULTIPLY, // Scan Code 0x37
VK_LMENU, // Scan Code 0x38
VK_SPACE, // Scan Code 0x39
VK_CAPITAL, // Scan Code 0x3A
VK_F1, // Scan Code 0x3B
VK_F2, // Scan Code 0x3C
VK_F3, // Scan Code 0x3D
VK_F4, // Scan Code 0x3E
VK_F5, // Scan Code 0x3F
VK_F6, // Scan Code 0x40
VK_F7, // Scan Code 0x41
VK_F8, // Scan Code 0x42
VK_F9, // Scan Code 0x43
VK_F10, // Scan Code 0x44
VK_NUMLOCK, // Scan Code 0x45
VK_SCROLL, // Scan Code 0x46
VK_NUMPAD7, // Scan Code 0x47
VK_NUMPAD8, // Scan Code 0x48
VK_NUMPAD9, // Scan Code 0x49
VK_SUBTRACT, // Scan Code 0x4A
VK_NUMPAD4, // Scan Code 0x4B
VK_NUMPAD5, // Scan Code 0x4C
VK_NUMPAD6, // Scan Code 0x4D
VK_ADD, // Scan Code 0x4E
VK_NUMPAD1, // Scan Code 0x4F
VK_NUMPAD2, // Scan Code 0x50
VK_NUMPAD3, // Scan Code 0x51
VK_NUMPAD0, // Scan Code 0x52
VK_DECIMAL, // Scan Code 0x53
VK_SNAPSHOT, // Scan Code 0x54
0, // Scan Code 0x55
0, // Scan Code 0x56
VK_F11, // Scan Code 0x57
VK_F12, // Scan Code 0x58
0, // Scan Code 0x59
0, // Scan Code 0x5A
VK_LWIN, // Scan Code 0x5B
VK_RWIN, // Scan Code 0x5C
VK_APPS, // Scan Code 0x5D
0, // Scan Code 0x5E
0, // Scan Code 0x5F
0, // Scan Code 0x60
0, // Scan Code 0x61
0, // Scan Code 0x62
VK_HELP, // Scan Code 0x63
VK_F13, // Scan Code 0x64
VK_F14, // Scan Code 0x65
VK_F15, // Scan Code 0x66
VK_F16, // Scan Code 0x67
VK_F17, // Scan Code 0x68
VK_F18, // Scan Code 0x69
VK_F19, // Scan Code 0x6A
VK_F20, // Scan Code 0x6B
VK_F21, // Scan Code 0x6C
VK_F22, // Scan Code 0x6D
VK_F23, // Scan Code 0x6E
0, // Scan Code 0x6F
0, // Scan Code 0x70
0, // Scan Code 0x71
0, // Scan Code 0x72
0, // Scan Code 0x73
0, // Scan Code 0x74
0, // Scan Code 0x75
VK_F24, // Scan Code 0x76
0, // Scan Code 0x77
0, // Scan Code 0x78
0, // Scan Code 0x79
0, // Scan Code 0x7A
0, // Scan Code 0x7B
0, // Scan Code 0x7C
0, // Scan Code 0x7D
0, // Scan Code 0x7E
0, // Scan Code 0x7F
};
#define E0ScanCodeTableFirst 0xe035
#define E0ScanCodeTableLast 0xe05d
const UINT8 ScanCodeE0ToVKeyTable[] =
{
VK_DIVIDE, // Scan Code 0xE035
0, // Scan Code 0xE036
VK_SNAPSHOT, // Scan Code 0xE037
VK_RMENU, // Scan Code 0xE038
0, // Scan Code 0xE039
0, // Scan Code 0xE03A
0, // Scan Code 0xE03B
0, // Scan Code 0xE03C
0, // Scan Code 0xE03D
0, // Scan Code 0xE03E
0, // Scan Code 0xE03F
0, // 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
VK_HOME, // Scan Code 0xE047
VK_UP, // Scan Code 0xE048
VK_PRIOR, // Scan Code 0xE049
0, // Scan Code 0xE04A
VK_LEFT, // Scan Code 0xE04B
0, // Scan Code 0xE04C
VK_RIGHT, // Scan Code 0xE04D
0, // Scan Code 0xE04E
VK_END, // Scan Code 0xE04F
VK_DOWN, // Scan Code 0xE050
VK_NEXT, // Scan Code 0xE051
VK_INSERT, // Scan Code 0xE052
VK_DELETE, // 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
0, // Scan Code 0xE05A
VK_LWIN, // Scan Code 0xE05B
VK_RWIN, // Scan Code 0xE05C
VK_APPS, // Scan Code 0xE05D
};
/*++
ScanCodeToVKeyEx:
Map a scan code to virtual key(s).
--*/
UINT32
ScanCodeToVKeyEx(
UINT32 ScanCode,
KEY_STATE_FLAGS KeyStateFlags,
UINT32 VKeyBuf[16],
UINT32 ScanCodeBuf[16],
KEY_STATE_FLAGS KeyStateFlagsBuf[16]
)
{
int cVKeys = 0;
#ifdef PROFILE
if (ScanCode == /* 77 VK_F8 */ 0x42 && KeyStateFlags == KeyStateDownFlag)
ProfileStart(200, PROFILE_OBJCALL);
if (ScanCode == /* 78 VK_F9 */ 0x43 && KeyStateFlags == KeyStateDownFlag)
ProfileStart(200, PROFILE_BUFFER);
if (ScanCode == /* 79 VK_F10 */ 0x44 && KeyStateFlags == KeyStateDownFlag)
ProfileStart(200, PROFILE_KCALL);
if (ScanCode == /* 7A VK_F11 */ 0x57 && KeyStateFlags == KeyStateDownFlag)
ProfileStart(1000, 0);
if (ScanCode == /* 7B VK_F12 */ 0x58 && KeyStateFlags == KeyStateDownFlag)
ProfileStop();
#endif
if ( ScanCode == 0x45 )
{
// The desktop shows that this is an extended
// scan code. To make it look the same, we
// pass back the scan code with a e0 tacked
// on to it.
VKeyBuf[cVKeys] = VK_NUMLOCK;
ScanCodeBuf[cVKeys] = 0xe045;
KeyStateFlagsBuf[cVKeys] = KeyStateFlags;
cVKeys++;
}
else if ( ScanCode == 0xe01c )
{
VKeyBuf[cVKeys] = VK_RETURN;
ScanCodeBuf[cVKeys] = ScanCode;
KeyStateFlagsBuf[cVKeys] = KeyStateFlags;
cVKeys++;
}
else if ( ScanCode == 0xe01d )
{
VKeyBuf[cVKeys] = VK_RCONTROL;
ScanCodeBuf[cVKeys] = ScanCode;
KeyStateFlagsBuf[cVKeys] = KeyStateFlags;
cVKeys++;
}
#if USE_ALT_GR
// Turn this on if you need AltGr on a keyboard.
else if ( ScanCode == 0xe038 )
{
VKeyBuf[cVKeys] = VK_RMENU;
ScanCodeBuf[cVKeys] = ScanCode;
KeyStateFlagsBuf[cVKeys] = KeyStateFlags;
cVKeys++;
VKeyBuf[cVKeys] = VK_RCONTROL;
ScanCodeBuf[cVKeys] = ScanCode;
KeyStateFlagsBuf[cVKeys] = KeyStateFlags;
cVKeys++;
}
#endif
else if ( ScanCode == 0xe11d45 )
{
VKeyBuf[cVKeys] = VK_PAUSE;
ScanCodeBuf[cVKeys] = 0x45;
KeyStateFlagsBuf[cVKeys] = KeyStateFlags;
cVKeys++;
}
else if ( ( ScanCode >= E0ScanCodeTableFirst ) &&
( ScanCode <= E0ScanCodeTableLast ) )
{
VKeyBuf[cVKeys] = ScanCodeE0ToVKeyTable[ScanCode - E0ScanCodeTableFirst];
if ( VKeyBuf[cVKeys] )
{
ScanCodeBuf[cVKeys] = ScanCode;
KeyStateFlagsBuf[cVKeys] = KeyStateFlags;
cVKeys++;
}
}
else if ( ScanCode <= ScanCodeTableLast )
{
VKeyBuf[cVKeys] = ScanCodeToVKeyTable[ScanCode];
if ( VKeyBuf[cVKeys] )
{
ScanCodeBuf[cVKeys] = ScanCode;
KeyStateFlagsBuf[cVKeys] = KeyStateFlags;
cVKeys++;
}
}
// The print screen key has an extra 0xe02a scan code
// in it. It doesn't do anything so we just ignore it.
if ( ( cVKeys == 0 ) &&
( ScanCode != 0xe02a ) )
{
RETAILMSG(1,(TEXT("Unknown scan code %x\r\n"), ScanCode));
}
return cVKeys;
}
static const UINT16 VKeyToScanCodeTable[COUNT_VKEYS] =
{
/* 00 */ 0,
/* 01 VK_LBUTTON */ 0,
/* 02 VK_RBUTTON */ 0,
/* 03 VK_CANCEL */ 0,
/* 04 VK_MBUTTON */ 0,
/* 05 */ 0,
/* 06 */ 0,
/* 07 */ 0,
/* 08 VK_BACK */ 0x0e,
/* 09 VK_TAB */ 0x0f,
/* 0A */ 0,
/* 0B */ 0,
/* 0C VK_CLEAR */ 0x4c,
/* 0D VK_RETURN */ 0x1c,
/* 0E */ 0,
/* 0F */ 0,
/* 10 VK_SHIFT */ 0x2a,
/* 11 VK_CONTROL */ 0x1d,
/* 12 VK_MENU */ 0x38,
/* 13 VK_PAUSE */ 0,
/* 14 VK_CAPITAL */ 0x3a,
/* 15 */ 0,
/* 16 */ 0,
/* 17 */ 0,
/* 18 */ 0,
/* 19 */ 0,
/* 1A */ 0,
/* 1B VK_ESCAPE */ 0x01,
/* 1C */ 0,
/* 1D */ 0,
/* 1E */ 0,
/* 1F */ 0,
/* 20 VK_SPACE */ 0x39,
/* 21 VK_PRIOR */ 0xe049,
/* 22 VK_NEXT */ 0xe051,
/* 23 VK_END */ 0xe04f,
/* 24 VK_HOME */ 0xe047,
/* 25 VK_LEFT */ 0xe04b,
/* 26 VK_UP */ 0xe048,
/* 27 VK_RIGHT */ 0xe04d,
/* 28 VK_DOWN */ 0xe050,
/* 29 VK_SELECT */ 0,
/* 2A VK_PRINT */ 0,
/* 2B VK_EXECUTE */ 0,
/* 2C VK_SNAPSHOT */ 0x54,
/* 2D VK_INSERT */ 0xe052,
/* 2E VK_DELETE */ 0xe053,
/* 2F VK_HELP */ 0,
/* 30 */ 0x0b,
/* 31 */ 0x02,
/* 32 */ 0x03,
/* 33 */ 0x04,
/* 34 */ 0x05,
/* 35 */ 0x06,
/* 36 */ 0x07,
/* 37 */ 0x08,
/* 38 */ 0x09,
/* 39 */ 0x0a,
/* 3A */ 0,
/* 3B */ 0,
/* 3C */ 0,
/* 3D */ 0,
/* 3E */ 0,
/* 3F */ 0,
/* 40 */ 0,
/* 41 */ 0x1e,
/* 42 */ 0x30,
/* 43 */ 0x2e,
/* 44 */ 0x20,
/* 45 */ 0x12,
/* 46 */ 0x21,
/* 47 */ 0x22,
/* 48 */ 0x23,
/* 49 */ 0x17,
/* 4A */ 0x24,
/* 4B */ 0x25,
/* 4C */ 0x26,
/* 4D */ 0x32,
/* 4E */ 0x31,
/* 4F */ 0x18,
/* 50 */ 0x19,
/* 51 */ 0x10,
/* 52 */ 0x13,
/* 53 */ 0x1f,
/* 54 */ 0x14,
/* 55 */ 0x16,
/* 56 */ 0x2f,
/* 57 */ 0x11,
/* 58 */ 0x2d,
/* 59 */ 0x15,
/* 5A */ 0x2c,
/* 5B VK_LWIN */ 0x5b,
/* 5C VK_RWIN */ 0x5c,
/* 5D VK_APPS */ 0x5d,
/* 5E */ 0,
/* 5F */ 0,
/* 60 VK_NUMPAD0 */ 0x52,
/* 61 VK_NUMPAD1 */ 0x4f,
/* 62 VK_NUMPAD2 */ 0x50,
/* 63 VK_NUMPAD3 */ 0x51,
/* 64 VK_NUMPAD4 */ 0x4b,
/* 65 VK_NUMPAD5 */ 0x4c,
/* 66 VK_NUMPAD6 */ 0x4d,
/* 67 VK_NUMPAD7 */ 0x47,
/* 68 VK_NUMPAD8 */ 0x48,
/* 69 VK_NUMPAD9 */ 0x49,
/* 6A VK_MULTIPLY */ 0xe037,
/* 6B VK_ADD */ 0x4e,
/* 6C VK_SEPARATOR */ 0,
/* 6D VK_SUBTRACT */ 0x4a,
/* 6E VK_DECIMAL */ 0x53,
/* 6F VK_DIVIDE */ 0xe035,
/* 70 VK_F1 */ 0x3b,
/* 71 VK_F2 */ 0x3c,
/* 72 VK_F3 */ 0x3d,
/* 73 VK_F4 */ 0x3e,
/* 74 VK_F5 */ 0x3f,
/* 75 VK_F6 */ 0x40,
/* 76 VK_F7 */ 0x41,
/* 77 VK_F8 */ 0x42,
/* 78 VK_F9 */ 0x43,
/* 79 VK_F10 */ 0x44,
/* 7A VK_F11 */ 0x57,
/* 7B VK_F12 */ 0x58,
/* 7C VK_F13 */ 0x64,
/* 7D VK_F14 */ 0x65,
/* 7E VK_F15 */ 0x66,
/* 7F VK_F16 */ 0x67,
/* 80 VK_F17 */ 0x68,
/* 81 VK_F18 */ 0x69,
/* 82 VK_F19 */ 0x6a,
/* 83 VK_F20 */ 0x6b,
/* 84 VK_F21 */ 0x6c,
/* 85 VK_F22 */ 0x6d,
/* 86 VK_F23 */ 0x6e,
/* 87 VK_F24 */ 0x76,
/* 88 */ 0,
/* 89 */ 0,
/* 8A */ 0,
/* 8B */ 0,
/* 8C */ 0,
/* 8D */ 0,
/* 8E */ 0,
/* 8F */ 0,
/* 90 VK_NUMLOCK */ 0xe045,
/* 91 VK_SCROLL */ 0x46,
/* 92 */ 0,
/* 93 */ 0,
/* 94 */ 0,
/* 95 */ 0,
/* 96 */ 0,
/* 97 */ 0,
/* 98 */ 0,
/* 99 */ 0,
/* 9A */ 0,
/* 9B */ 0,
/* 9C */ 0,
/* 9D */ 0,
/* 9E */ 0,
/* 9F */ 0,
/* A0 VK_LSHIFT */ 0x2a,
/* A1 VK_RSHIFT */ 0x36,
/* A2 VK_LCONTROL */ 0x1d,
/* A3 VK_RCONTROL */ 0xe01d,
/* A4 VK_LMENU */ 0x38,
/* A5 VK_RMENU */ 0xe038,
/* A6 */ 0,
/* A7 */ 0,
/* A8 */ 0,
/* A9 */ 0,
/* AA */ 0,
/* AB */ 0,
/* AC */ 0,
/* AD */ 0,
/* AE */ 0,
/* AF */ 0,
/* B0 */ 0,
/* B1 */ 0,
/* B2 */ 0,
/* B3 */ 0,
/* B4 */ 0,
/* B5 */ 0,
/* B6 */ 0,
/* B7 */ 0,
/* B8 */ 0,
/* B9 */ 0,
/* BA VK_SEMICOLON */ 0x27,
/* BB VK_EQUAL */ 0x0d,
/* BC VK_COMMA */ 0x33,
/* BD VK_HYPHEN */ 0x0c,
/* BE VK_PERIOD */ 0x34,
/* BF VK_SLASH */ 0x35,
/* C0 VK_BACKQUOTE */ 0x29,
/* C1 */ 0,
/* C2 */ 0,
/* C3 */ 0,
/* C4 */ 0,
/* C5 */ 0,
/* C6 */ 0,
/* C7 */ 0,
/* C8 */ 0,
/* C9 */ 0,
/* CA */ 0,
/* CB */ 0,
/* CC */ 0,
/* CD */ 0,
/* CE */ 0,
/* CF */ 0,
/* D0 */ 0,
/* D1 */ 0,
/* D2 */ 0,
/* D3 */ 0,
/* D4 */ 0,
/* D5 */ 0,
/* D6 */ 0,
/* D7 */ 0,
/* D8 */ 0,
/* D9 */ 0,
/* DA */ 0,
/* DB VK_LBRACKET */ 0x1a,
/* DC VK_BACKSLASH */ 0x2b,
/* DD VK_RBRACKET */ 0x1b,
/* DE VK_APOSTROPHE */ 0x28,
/* DF VK_OFF */ 0,
/* E0 */ 0,
/* E1 */ 0,
/* E2 */ 0,
/* E3 */ 0,
/* E4 */ 0,
/* E5 */ 0,
/* E6 */ 0,
/* E7 */ 0,
/* E8 */ 0,
/* E9 */ 0,
/* EA */ 0,
/* EB */ 0,
/* EC */ 0,
/* ED */ 0,
/* EE */ 0,
/* EF */ 0,
/* F0 */ 0,
/* F1 */ 0,
/* F2 */ 0,
/* F3 */ 0,
/* F4 */ 0,
/* F5 */ 0,
/* F6 */ 0,
/* F7 */ 0,
/* F8 */ 0,
/* F9 */ 0,
/* FA */ 0,
/* FB */ 0,
/* FC */ 0,
/* FD */ 0,
/* FE */ 0,
/* FF */ 0
};
/*++
Maps a virtual key to a scan code. The LR specific virtual keys are mapped to LR specific scan
codes.
--*/
UINT32
VKeyToScanCode(
UINT32 vkey
)
{
if ( vkey >= COUNT_VKEYS )
{
return 0;
}
return VKeyToScanCodeTable[vkey];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -