📄 scvks3c2400msengus1.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_MENU, // Scan Code 0x1
0, // Scan Code 0x2
0, // Scan Code 0x3
0, // Scan Code 0x4
0, // Scan Code 0x5
0, // Scan Code 0x6
0, // Scan Code 0x7
0, // Scan Code 0x8
VK_BACKQUOTE, // Scan Code 0x9
VK_BACKSLASH, // Scan Code 0xA
VK_TAB, // Scan Code 0xB
'Z', // Scan Code 0xC
'A', // Scan Code 0xD
'X', // Scan Code 0xE
0, // Scan Code 0xF
0, // Scan Code 0x10
0, // Scan Code 0x11
VK_SHIFT, // Scan Code 0x12
0, // Scan Code 0x13
0, // Scan Code 0x14
0, // Scan Code 0x15
0, // Scan Code 0x16
0, // Scan Code 0x17
0, // Scan Code 0x18
VK_CONTROL, // Scan Code 0x19
0, // Scan Code 0x1A
0, // Scan Code 0x1B
0, // Scan Code 0x1C
0, // Scan Code 0x1D
0, // Scan Code 0x1E
0, // Scan Code 0x1F
0, // Scan Code 0x20
0, // Scan Code 0x21, Fn
0, // Scan Code 0x22
0, // Scan Code 0x23
0, // Scan Code 0x24
0, // Scan Code 0x25
0, // Scan Code 0x26
0, // Scan Code 0x27
0, // Scan Code 0x28
VK_ESCAPE, // Scan Code 0x29
VK_DELETE, // Scan Code 0x2A
'Q', // Scan Code 0x2B
VK_CAPITAL, // Scan Code 0x2C
'S', // Scan Code 0x2D
'C', // Scan Code 0x2E
'3', // Scan Code 0x2F
0, // Scan Code 0x30
'1', // Scan Code 0x31
0, // Scan Code 0x32
'W', // Scan Code 0x33
0, // Scan Code 0x34
'D', // Scan Code 0x35
'V', // Scan Code 0x36
'4', // Scan Code 0x37
0, // Scan Code 0x38
'2', // Scan Code 0x39
'T', // Scan Code 0x3A
'E', // Scan Code 0x3B
0, // Scan Code 0x3C
'F', // Scan Code 0x3D
'B', // Scan Code 0x3E
'5', // Scan Code 0x3F
0, // Scan Code 0x40
'9', // Scan Code 0x41
'Y', // Scan Code 0x42
'R', // Scan Code 0x43
'K', // Scan Code 0x44
'G', // Scan Code 0x45
'N', // Scan Code 0x46
'6', // Scan Code 0x47
0, // Scan Code 0x48
'0', // Scan Code 0x49
'U', // Scan Code 0x4A
'O', // Scan Code 0x4B
'L', // Scan Code 0x4C
'H', // Scan Code 0x4D
'M', // Scan Code 0x4E
'7', // Scan Code 0x4F
0, // Scan Code 0x50
VK_HYPHEN, // Scan Code 0x51
'I', // Scan Code 0x52
'P', // Scan Code 0x53
VK_SEMICOLON, // Scan Code 0x54
'J', // Scan Code 0x55
VK_COMMA, // Scan Code 0x56
'8', // Scan Code 0x57
0, // Scan Code 0x58
VK_EQUAL, // Scan Code 0x59
VK_RETURN, // Scan Code 0x5A
VK_LBRACKET, // Scan Code 0x5B
VK_APOSTROPHE, // Scan Code 0x5C
VK_SLASH, // Scan Code 0x5D
VK_PERIOD, // Scan Code 0x5E
VK_RWIN, // Scan Code 0x5F, Prog
0, // Scan Code 0x60
0, // Scan Code 0x61
VK_SHIFT, // Scan Code 0x62
0, // Scan Code 0x63
0, // Scan Code 0x64
0, // Scan Code 0x65
0, // Scan Code 0x66
0, // Scan Code 0x67
0, // Scan Code 0x68
VK_BACK, // Scan Code 0x69
VK_DOWN, // Scan Code 0x6A
VK_RBRACKET, // Scan Code 0x6B
VK_UP, // Scan Code 0x6C
VK_LEFT, // Scan Code 0x6D
VK_SPACE, // Scan Code 0x6E
VK_RIGHT, // 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
0, // 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 0xe010
#define E0ScanCodeTableLast 0xe06d
const UINT8 ScanCodeE0ToVKeyTable[] =
{
VK_MEDIA_PREV_TRACK, // Scan Code 0xE010
0, // Scan Code 0xE011
0, // Scan Code 0xE012
0, // Scan Code 0xE013
0, // Scan Code 0xE014
0, // Scan Code 0xE015
0, // Scan Code 0xE016
0, // Scan Code 0xE017
0, // Scan Code 0xE018
VK_MEDIA_NEXT_TRACK, // Scan Code 0xE019
0, // Scan Code 0xE01A
0, // Scan Code 0xE01B
0, // Scan Code 0xE01C
0, // Scan Code 0xE01D
0, // Scan Code 0xE01E
0, // Scan Code 0xE01F
VK_VOLUME_MUTE, // Scan Code 0xE020
VK_LAUNCH_APP2, // Scan Code 0xE021
VK_MEDIA_PLAY_PAUSE, // Scan Code 0xE022
0, // Scan Code 0xE023
VK_MEDIA_STOP, // Scan Code 0xE024
0, // Scan Code 0xE025
0, // Scan Code 0xE026
0, // Scan Code 0xE027
0, // Scan Code 0xE028
0, // Scan Code 0xE029
0, // Scan Code 0xE02A
0, // Scan Code 0xE02B
0, // Scan Code 0xE02C
0, // Scan Code 0xE02D
VK_VOLUME_DOWN, // Scan Code 0xE02E
0, // Scan Code 0xE02F
VK_VOLUME_UP, // Scan Code 0xE030
0, // Scan Code 0xE031
VK_BROWSER_HOME, // Scan Code 0xE032
0, // Scan Code 0xE033
0, // Scan Code 0xE034
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
0, // Scan Code 0xE05E
VK_SLEEP, // Scan Code 0xE05F
0, // Scan Code 0xE060
0, // Scan Code 0xE061
0, // Scan Code 0xE062
0, // Scan Code 0xE063
0, // Scan Code 0xE064
VK_BROWSER_SEARCH, // Scan Code 0xE065
VK_BROWSER_FAVORITES, // Scan Code 0xE066
VK_BROWSER_REFRESH, // Scan Code 0xE067
VK_BROWSER_STOP, // Scan Code 0xE068
VK_BROWSER_FORWARD, // Scan Code 0xE069
VK_BROWSER_BACK, // Scan Code 0xE06A
VK_LAUNCH_APP1, // Scan Code 0xE06B
VK_LAUNCH_MAIL, // Scan Code 0xE06C
VK_LAUNCH_MEDIA_SELECT, // Scan Code 0xE06D
};
/*++
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 ) )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -