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

📄 kbdkor.cpp

📁 此代码为WCE5.0下键盘驱动的源代码
💻 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 + -