📄 builtinkeypad_0409.cpp
字号:
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
//
// Use of this sample source code is subject to the terms of the Microsoft
// license agreement under which you licensed this sample source code. If
// you did not accept the terms of the license agreement, you are not
// authorized to use this sample source code. For the terms of the license,
// please see the license agreement between you and Microsoft or, if applicable,
// see the LICENSE.RTF on your install media or the root of your tools installation.
// THE SAMPLE SOURCE CODE IS PROVIDED "AS IS", WITH NO WARRANTIES OR INDEMNITIES.
//
//
// (C) Copyright 2006 Marvell International Ltd.
// All Rights Reserved
//
/*++
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 BuiltInKeypad.cpp |
Sample implementation of the platform dependent scan code to
Virtual Key mapping for a built-in keypad driver.
*/
/******************************************************************************
**
** INTEL CONFIDENTIAL
** Copyright 2000-2004 Intel Corporation All Rights Reserved.
**
** The source code contained or described herein and all documents
** related to the source code (Material) are owned by Intel Corporation
** or its suppliers or licensors. Title to the Material remains with
** Intel Corporation or its suppliers and licensors. The Material contains
** trade secrets and proprietary and confidential information of Intel
** or its suppliers and licensors. The Material is protected by worldwide
** copyright and trade secret laws and treaty provisions. No part of the
** Material may be used, copied, reproduced, modified, published, uploaded,
** posted, transmitted, distributed, or disclosed in any way without Intel抯
** prior express written permission.
**
** No license under any patent, copyright, trade secret or other intellectual
** property right is granted to or conferred upon you by disclosure or
** delivery of the Materials, either expressly, by implication, inducement,
** estoppel or otherwise. Any license under such intellectual property rights
** must be express and approved by Intel in writing.
**
/*****************************************************************************/
#include <windows.h>
#include <keybddr.h>
#include <laymgr.h>
#include <devicelayout.h>
#include "winuserm.h"
#include "keypad_soc.h"
#define NUM_SCAN_CODE_MAX 0x40
#define UNIQUE_KEY_SC_RAW_BEGIN 0x30
#define UNIQUE_KEY_SC_RAW_END 0x3F
#define KEY_STATE_ALL_SHIFTS_MSK (KeyShiftAnyShiftFlag | KeyShiftCapitalFlag |\
KeyShiftLeftShiftFlag | KeyShiftRightShiftFlag)
// This is how we get most of the Zylonite's non-
// alphanumeric characters translated properly to
// Unicode.
typedef struct _FnTransform
{
UINT32 ulVKey;
BOOL bReportAsShifted;
}FnTransform;
typedef struct _FnRemap
{
FnTransform UnToggledTranform;
FnTransform ToggledTranform;
}FnRemap;
const UINT8 RawScanCodeToWinCeScanCodeTable[NUM_SCAN_CODE_MAX] =
{
0x00, // Scan Code 0x00 ['A']
0x01, // Scan Code 0x01 ['B']
0x02, // Scan Code 0x02 ['C']
0x3A, // Scan Code 0x03 [VK_APP1]
0x3C, // Scan Code 0x04 [VK_APP3]
0x03, // Scan Code 0x05 ['D']
0x20, // Scan Code 0x06 [VK_TSOFT1]
0x1B, // Scan Code 0x07 [VK_TUP]
0x04, // Scan Code 0x08 ['E']
0x05, // Scan Code 0x09 ['F']
0x06, // Scan Code 0x0A ['G']
0x31, // Scan Code 0x0B ['1' and '@']
0x33, // Scan Code 0x0C ['3' and '?']
0x07, // Scan Code 0x0D ['H']
0x21, // Scan Code 0x0E [VK_TSOFT2]
0x1C, // Scan Code 0x0F [VK_TDOWN]
0x08, // Scan Code 0x10 ['I']
0x09, // Scan Code 0x11 ['J']
0x0A, // Scan Code 0x12 ['K']
0x34, // Scan Code 0x13 ['4' and '-']
0x36, // Scan Code 0x14 ['6' and '\']
0x0B, // Scan Code 0x15 ['L']
0x22, // Scan Code 0x16 [VK_THOME]
0x1D, // Scan Code 0x17 [VK_TLEFT]
0x0C, // Scan Code 0x18 ['M']
0x0D, // Scan code 0x19 ['N']
0x0E, // Scan Code 0x1A ['O']
0x37, // Scan Code 0x1B ['7' and ':']
0x39, // Scan Code 0x1C ['9' and '"']
0x0F, // Scan Code 0x1D ['P']
0x23, // Scan Code 0x1E [VK_TBACK]
0x1E, // Scan Code 0x1F [VK_TRIGHT]
0x3B, // Scan Code 0x20 [VK_APP2]
0x32, // Scan Code 0x21 ['2' and '&']
0x35, // Scan Code 0x22 ['5' and ''']
0x38, // Scan Code 0x23 ['8' and ';']
0x30, // Scan Code 0x24 ['0' and '+']
0x1A, // Scan Code 0x25 [VK_SPACE]
0x1F, // Scan Code 0x26 [WHEEL_PRESS]
0xFF, // Scan Code 0x27
0x10, // Scan Code 0x28 ['Q']
0x11, // Scan Code 0x29 ['R']
0x12, // Scan Code 0x2A ['S']
0x3D, // Scan Code 0x2B ['*' and ',']
0x3E, // Scan Code 0x2C ['#' and '.']
0x13, // Scan Code 0x2D ['T']
0x24, // Scan Code 0x2E [VK_TTALK]
0x1F, // Scan Code 0x2F [VK_RETURN]
0x14, // Scan Code 0x30 ['U']
0x15, // Scan Code 0x31 ['V']
0x16, // Scan Code 0x32 ['W']
0x26, // Scan Code 0x33 [VK_CAPITAL]
0x3F, // Scan Code 0x34 [VK_RETURN]
0x17, // scan code 0x35 ['X']
0x25, // Scan Code 0x36 [VK_TEND]
0xFF, // Scan Code 0x37 [Up left Corner]
0xFF, // Scan Code 0x38
0x18, // Scan Code 0x39 ['Y']
0x19, // Scan Code 0x3A ['Z']
0xFF, // Scan Code 0x3B
0x29, // Scan Code 0x3C [WHEEL_UP]
0x2A, // Scan Code 0x3D [WHEEL_DOWN]
0xFF, // Scan Code 0x3E [Right Corner]
0xFF // Scan Code 0x3F [Down left Corner]
}; //RawScanCodeToWinCeScanCodeTable[]
const UINT8 WinCeScanCodeToVKeyTable[NUM_SCAN_CODE_MAX]=
{
'A', // 0x00
'B', // 0x01
'C', // 0x02
'D', // 0x03
'E', // 0x04
'F', // 0x05
'G', // 0x06
'H', // 0x07
'I', // 0x08
'J', // 0x09
'K', // 0x0A
'L', // 0x0B
'M', // 0x0C
'N', // 0x0D
'O', // 0x0E
'P', // 0x0F
'Q', // 0x10
'R', // 0x11
'S', // 0x12
'T', // 0x13
'U', // 0x14
'V', // 0x15
'W', // 0x16
'X', // 0x17
'Y', // 0x18
'Z', // 0x19
VK_SPACE, // 0X1A
VK_TUP, // 0X1B
VK_TDOWN, // 0X1C
VK_TLEFT, // 0X1D
VK_TRIGHT, // 0X1E
VK_RETURN, // 0X1F
VK_TAB, //VK_TSOFT1, // 0X20
VK_TSOFT2, // 0X21
VK_THOME, // 0X22
VK_TBACK, // 0x23
VK_TTALK, // 0x24
VK_TEND, // 0x25
VK_CAPITAL, // 0x26
VK_TVOLUMEUP, // 0x27
VK_TVOLUMEDOWN,// 0x28
VK_UP, // 0x29
VK_DOWN, // 0x2A
0, // 0x2B
0, // 0x2C
0, // 0x2D
0, // 0x2E
0, // 0x2F
VK_T0, // 0x30
VK_T1, // 0x31
VK_T2, // 0x32
VK_T3, // 0x33
VK_T4, // 0x34
VK_T5, // 0x35
VK_T6, // 0x36
VK_T7, // 0x37
VK_T8, // 0x38
VK_T9, // 0x39
VK_APP1, // 0x3A
VK_APP2, // 0x3B
VK_APP3, // 0x3C
VK_COMMA, // 0x3D
VK_PERIOD, // 0x3E
VK_RETURN, // 0x3F
};
// transform: vk shifted? vk shifted?
static FnRemap FnRampTable[] =
{
{ {VK_T0, FALSE}, {VK_ADD, FALSE} }, // 0x00
{ {VK_T1, FALSE}, {'2', TRUE } }, // 0x01
{ {VK_T2, FALSE}, {'7', TRUE } }, // 0x02
{ {VK_T3, FALSE}, {VK_SLASH, TRUE } }, // 0x03
{ {VK_T4, FALSE}, {VK_HYPHEN, FALSE} }, // 0x04
{ {VK_T5, FALSE}, {VK_APOSTROPHE, FALSE} }, // 0x05
{ {VK_T6, FALSE}, {VK_BACKSLASH, FALSE} }, // 0x06
{ {VK_T7, FALSE}, {VK_SEMICOLON, TRUE } }, // 0x07
{ {VK_T8, FALSE}, {VK_SEMICOLON, FALSE} }, // 0x08
{ {VK_T9, FALSE}, {VK_APOSTROPHE, TRUE } }, // 0x09
{ {VK_APP1, FALSE}, {'9', TRUE } }, // 0x0A
{ {VK_APP2, FALSE}, {'0', TRUE } }, // 0x0B
{ {VK_APP3, FALSE}, {'1', TRUE } }, // 0x0C
{ {'8', TRUE }, {VK_COMMA, FALSE} }, // 0x0D
{ {'3', TRUE }, {VK_PERIOD, FALSE} }, // 0x0E
{ {VK_BACK, FALSE}, {VK_RETURN, FALSE} }, // 0x0F
};
static ScanCodeToVKeyData MainScanCodeToVKeyTableInfo =
{
0,
0,
NUM_SCAN_CODE_MAX - 1,
(UINT8 *)&WinCeScanCodeToVKeyTable[0]
};
static ScanCodeToVKeyData *rgscvkBuiltInKeypad_Tables[] =
{ &MainScanCodeToVKeyTableInfo };
UINT8 KbdPlatGetWinCeScanCode(UINT8 ucRawSc)
{
if (ucRawSc < NUM_SCAN_CODE_MAX)
{
return RawScanCodeToWinCeScanCodeTable[ucRawSc];
}
return 0xFF;
}
static UINT WINAPI
BuiltInKeypad_RemapVKey(
const KEYBD_EVENT *pKbdEvents,
UINT cKbdEvents,
KEYBD_EVENT *pRmpKbdEvents,
UINT cMaxRmpKbdEvents
)
{
SETFNAME(_T("BuiltInKeypad_RemapVKey"));
UINT uiSumRemapped = 0;
UINT i;
if (NULL == pRmpKbdEvents)
{
return cKbdEvents * 3;
}
for (i=0; i<cKbdEvents; i++)
{
if ((pKbdEvents->uiSc >= UNIQUE_KEY_SC_RAW_BEGIN) &&
(pKbdEvents->uiSc <= UNIQUE_KEY_SC_RAW_END))
{
UINT8 ucFnTransIndex;
FnTransform *pFnTrans;
ucFnTransIndex = pKbdEvents->uiSc - UNIQUE_KEY_SC_RAW_BEGIN;
if (pKbdEvents->KeyStateFlags & KeyShiftCapitalFlag)
{
pFnTrans = &(FnRampTable[ucFnTransIndex].ToggledTranform);
}
else
{
pFnTrans = &(FnRampTable[ucFnTransIndex].UnToggledTranform);
}
if (pFnTrans->bReportAsShifted)
{
pRmpKbdEvents->KeyStateFlags = KeyStateDownFlag;
pRmpKbdEvents->uiVk = VK_SHIFT; // set shift state to true
pRmpKbdEvents->uiSc = 0x4D; // invent a scan code
pRmpKbdEvents++;
uiSumRemapped++;
pRmpKbdEvents->KeyStateFlags = pKbdEvents->KeyStateFlags;
pRmpKbdEvents->uiVk = pFnTrans->ulVKey;
pRmpKbdEvents->uiSc = pKbdEvents->uiSc;
pRmpKbdEvents++;
uiSumRemapped++;
pRmpKbdEvents->KeyStateFlags = 0;
pRmpKbdEvents->uiVk = VK_SHIFT; // set shift state to true
pRmpKbdEvents->uiSc = 0x4D; // invent a scan code
}
else
{
pRmpKbdEvents->uiVk = pFnTrans->ulVKey;
pRmpKbdEvents->KeyStateFlags = pKbdEvents->KeyStateFlags & (~KEY_STATE_ALL_SHIFTS_MSK);
pRmpKbdEvents->uiSc = pKbdEvents->uiSc;
}
}
else
{
// Standard key. Normal processing.
pRmpKbdEvents->uiVk = pKbdEvents->uiVk;
pRmpKbdEvents->uiSc = pKbdEvents->uiSc;
pRmpKbdEvents->KeyStateFlags = pKbdEvents->KeyStateFlags;
}
pRmpKbdEvents++;
pKbdEvents++;
uiSumRemapped++;
}
return uiSumRemapped;
} // BuiltInKeypad_RemapVKey()
static DEVICE_LAYOUT dlBuiltInKeypad =
{
sizeof(DEVICE_LAYOUT),
KEYPAD_PDD_ID,
rgscvkBuiltInKeypad_Tables,
dim(rgscvkBuiltInKeypad_Tables),
BuiltInKeypad_RemapVKey,
};
// Suffix _00000409 is required for layouts that support
// (US English)
extern "C" BOOL
BuiltInKeypad_00000409(
PDEVICE_LAYOUT pDeviceLayout
)
{
DEBUGCHK(pDeviceLayout != NULL);
if (pDeviceLayout->dwSize != sizeof(DEVICE_LAYOUT))
{
RETAILMSG(1, (_T("BuiltInKeypad_00000409: data structure size mismatch\r\n")));
return FALSE;
}
*pDeviceLayout = dlBuiltInKeypad;
return TRUE;
}
#ifdef DEBUG
// Verify function declaration against the typedef.
static PFN_DEVICE_LAYOUT_ENTRY v_pfnDeviceLayout = BuiltInKeypad_00000409;
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -