⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 scvks3c2400mskor1.cpp

📁 三星2410的BSP开发包
💻 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	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

	//	Some Korean specific keys only generate a single
	//	event when pressed.  This turns it into a key down
	//	and key up to keep the rest of the driver happy.
	if ( ( ScanCode == 0x71 ) ||
		 ( ScanCode == 0x72 ) )
		{
		VKeyBuf[cVKeys] = ScanCodeToVKeyTable[ScanCode];
		ScanCodeBuf[cVKeys] = ScanCode;
		KeyStateFlagsBuf[cVKeys] = KeyStateDownFlag;
		cVKeys++;

		VKeyBuf[cVKeys] = ScanCodeToVKeyTable[ScanCode];
		ScanCodeBuf[cVKeys] = ScanCode;
		KeyStateFlagsBuf[cVKeys] = 0;
		cVKeys++;
		}
	else 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++;
			}
			DEBUGMSG(1, (TEXT("Ascii code = %c\r\n"), (char)VKeyBuf[0]));
		}

	//	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 VK_HANGEUL	*/	0x72,
/* 16 */				0,
/* 17 */				0,
/* 18 */				0,
/* 19 VK_HANJA		*/	0x71,
/* 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 + -