sctovk.cpp

来自「WinCE 3.0 BSP, 包含Inter SA1110, Intel_815」· C++ 代码 · 共 380 行

CPP
380
字号
/*++
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.
Copyright (c) 1995, 1996, 1997  Microsoft Corporation

@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.  

This file version is for the Sejin SPR 8696WT IR keyboard and Sejin
Model AC-IR9 Serial IR Receiver.

*/ 

#include <windows.h>
#include <keybddr.h>

#include <ir_kbd.h>

extern UINT8 v_NumLockState;

// This define must match the same define in PDD/smckbpdd.cpp

#define VK_SPECIAL    (0xFF)

#define COUNT_SCAN_CODES    128

extern "C"
const UINT8  ScanCodeToVKeyTable[COUNT_SCAN_CODES] =
{
    0,              // Scan Code 0x00
    0,              // Scan Code 0x01
    'B',            // Scan Code 0x02
    VK_TAB,         // Scan Code 0x03
    VK_RIGHT,       // Scan Code 0x04
    VK_SPACE,       // Scan Code 0x05
    VK_APOSTROPHE,  // Scan Code 0x06
    VK_LSHIFT,      // Scan Code 0x07
    VK_HYPHEN,      // Scan Code 0x08
    VK_LBRACKET,    // Scan Code 0x09
    0,              // Scan Code 0x0A
    VK_RETURN,      // Scan Code 0x0B
    VK_INSERT,      // Scan Code 0x0C
    VK_LEFT,        // Scan Code 0x0D
    0,              // Scan Code 0x0E
    0,              // Scan Code 0x0F

    0,              // Scan Code 0x10
    0,              // Scan Code 0x11
    'A',            // Scan Code 0x12
    'S',            // Scan Code 0x13
    'D',            // Scan Code 0x14
    'F',            // Scan Code 0x15
    'J',            // Scan Code 0x16 ( FN -> NUMPAD1 )
    0,              // Scan Code 0x17
    'K',            // Scan Code 0x18 ( FN -> NUMPAD2 )
    'L',            // Scan Code 0x19 ( FN -> NUMPAD3 )
    0,              // Scan Code 0x1A
    VK_SEMICOLON,   // Scan Code 0x1B ( FN -> ADD )
    VK_NEXT,        // Scan Code 0x1C
    VK_END,         // Scan Code 0x1D
    VK_LWIN,        // Scan Code 0x1E
    0,              // Scan Code 0x1F

    0,              // Scan Code 0x20
    0,              // Scan Code 0x21 (no R-MENU/ALT, use FN -> L-MENU/ALT)
    'Q',            // Scan Code 0x22
    'W',            // Scan Code 0x23
    'E',            // Scan Code 0x24
    'R',            // Scan Code 0x25
    'U',            // Scan Code 0x26 ( FN -> NUMPAD4 )
    0,              // Scan Code 0x27
    'I',            // Scan Code 0x28 ( FN -> NUMPAD5 )
    'O',            // Scan Code 0x29 ( FN -> NUMPAD6 )
    0,              // Scan Code 0x2A
    'P',            // Scan Code 0x2B ( FN -> SUBTRACT )
    VK_RBRACKET,    // Scan Code 0x2C
    VK_PAUSE,       // Scan Code 0x2D
    0,              // Scan Code 0x2E
    0,              // Scan Code 0x2F

    0,              // Scan Code 0x30
    0,              // Scan Code 0x31
    'Z',            // Scan Code 0x32
    'X',            // Scan Code 0x33
    'C',            // Scan Code 0x34
    'V',            // Scan Code 0x35
    'M',            // Scan Code 0x36 ( FN -> NUMPAD0 )
    VK_RSHIFT,      // Scan Code 0x37
    VK_COMMA,       // Scan Code 0x38
    VK_PERIOD,      // Scan Code 0x39 ( FN -> DECIMAL )
    0,              // Scan Code 0x3A
    VK_SLASH,       // Scan Code 0x3B ( FN -> DIVIDE )
    0,              // Scan Code 0x3C
    'N',            // Scan Code 0x3D
    0,              // Scan Code 0x3E
    0,              // Scan Code 0x3F

    0,              // Scan Code 0x40
    VK_DELETE,      // Scan Code 0x41
    VK_F3,          // Scan Code 0x42
    VK_ESCAPE,      // Scan Code 0x43
    VK_F5,          // Scan Code 0x44
    '5',            // Scan Code 0x45
    '6',            // Scan Code 0x46
    0,              // Scan Code 0x47
    VK_F6,          // Scan Code 0x48
    VK_F8,          // Scan Code 0x49
    0,              // Scan Code 0x4A
    VK_EQUAL,       // Scan Code 0x4B
    VK_BACK,        // Scan Code 0x4C
    VK_HOME,        // Scan Code 0x4D
    0,              // Scan Code 0x4E (no R-WIN, use FN -> L-WIN)
    0,              // Scan Code 0x4F

    0,              // Scan Code 0x50
    0,              // Scan Code 0x51
    VK_F2,          // Scan Code 0x52
    VK_F1,          // Scan Code 0x53
    VK_F4,          // Scan Code 0x54
    'G',            // Scan Code 0x55
    'H',            // Scan Code 0x56
    0,              // Scan Code 0x57
    VK_F7,          // Scan Code 0x58
    VK_F9,          // Scan Code 0x59
    0,              // Scan Code 0x5A
    VK_BACKSLASH,   // Scan Code 0x5B
    VK_UP,          // Scan Code 0x5C
    VK_PRIOR,       // Scan Code 0x5D
    0,              // Scan Code 0x5E
    VK_LCONTROL,    // Scan Code 0x5F ( FN -> RCONTROL )

    0,              // Scan Code 0x60 ( FN key - NO VK )
    0,              // Scan Code 0x61
    '1',            // Scan Code 0x62
    '2',            // Scan Code 0x63
    '3',            // Scan Code 0x64
    '4',            // Scan Code 0x65
    '7',            // Scan Code 0x66 ( FN -> NUMPAD7 )
    0,              // Scan Code 0x67
    '8',            // Scan Code 0x68 ( FN -> NUMPAD8 )
    '9',            // Scan Code 0x69 ( FN -> NUMPAD9 )
    0,              // Scan Code 0x6A
    '0',            // Scan Code 0x6B ( FN -> MULTIPLY )
    VK_DOWN,        // Scan Code 0x6C
    VK_APPS,        // Scan Code 0x6D
    0,              // Scan Code 0x6E
    0,              // Scan Code 0x6F (no R-CTRL, use FN -> L-CTRL)

    0,              // Scan Code 0x70
    VK_LMENU,       // Scan Code 0x71 ( FN -> RMENU/ALT )
    VK_BACKQUOTE,   // Scan Code 0x72
    VK_SPECIAL,     // Scan Code 0x73 ( VK_CAPITAL needs special handling)
    VK_SPECIAL,     // Scan Code 0x74 ( VK_NUMLOCK needs special handling)
    'T',            // Scan Code 0x75
    'Y',            // Scan Code 0x76
    0,              // Scan Code 0x77
    VK_F11,         // Scan Code 0x78
    VK_F10,         // Scan Code 0x79
    0,              // Scan Code 0x7A
    VK_F12,         // Scan Code 0x7B
    VK_SNAPSHOT,    // Scan Code 0x7C
    VK_SPECIAL,     // Scan Code 0x7D ( VK_SCROLL needs special handling)
    0,              // Scan Code 0x7E
    0               // Scan Code 0x7F
};


//////////////////////////////////////////////////////////
//
// Convert from Scan code w/FN active state to Virtual Key
//
// Most codes will be the same as the normal VK codes to
//  still output the same codes if FN should not have an
//  effect and keep the most flexibility.
//
//////////////////////////////////////////////////////////

extern "C"
const UINT8  ScanCodeFNToVKeyTable[COUNT_SCAN_CODES] =
{
    0,              // Scan Code 0x00
    0,              // Scan Code 0x01
    'B',            // Scan Code 0x02
    VK_TAB,         // Scan Code 0x03
    VK_RIGHT,       // Scan Code 0x04
    VK_SPACE,       // Scan Code 0x05
    VK_APOSTROPHE,  // Scan Code 0x06
    VK_LSHIFT,      // Scan Code 0x07
    VK_HYPHEN,      // Scan Code 0x08
    VK_LBRACKET,    // Scan Code 0x09
    0,              // Scan Code 0x0A
    VK_RETURN,      // Scan Code 0x0B
    VK_INSERT,      // Scan Code 0x0C
    VK_LEFT,        // Scan Code 0x0D
    0,              // Scan Code 0x0E
    0,              // Scan Code 0x0F

    0,              // Scan Code 0x10
    0,              // Scan Code 0x11
    'A',            // Scan Code 0x12
    'S',            // Scan Code 0x13
    'D',            // Scan Code 0x14
    'F',            // Scan Code 0x15
    VK_NUMPAD1,     // Scan Code 0x16 ( FN -> 'J' -> NUMPAD1 )
    0,              // Scan Code 0x17
    VK_NUMPAD2,     // Scan Code 0x18 ( FN -> 'K' -> NUMPAD2 )
    VK_NUMPAD3,     // Scan Code 0x19 ( FN -> 'L' -> NUMPAD3 )
    0,              // Scan Code 0x1A
    VK_ADD,         // Scan Code 0x1B ( FN -> SEMICOLON -> ADD )
    VK_NEXT,        // Scan Code 0x1C
    VK_END,         // Scan Code 0x1D
    VK_LWIN,        // Scan Code 0x1E
    0,              // Scan Code 0x1F

    0,              // Scan Code 0x20
    0,              // Scan Code 0x21 (no R-MENU/ALT, use FN -> L-MENU/ALT)
    'Q',            // Scan Code 0x22
    'W',            // Scan Code 0x23
    'E',            // Scan Code 0x24
    'R',            // Scan Code 0x25
    VK_NUMPAD4,     // Scan Code 0x26 ( FN -> 'U' -> NUMPAD4 )
    0,              // Scan Code 0x27
    VK_NUMPAD5,     // Scan Code 0x28 ( FN -> 'I' -> NUMPAD5 )
    VK_NUMPAD6,     // Scan Code 0x29 ( FN -> 'O' -> NUMPAD6 )
    0,              // Scan Code 0x2A
    VK_SUBTRACT,    // Scan Code 0x2B ( FN -> 'P' -> SUBTRACT )
    VK_RBRACKET,    // Scan Code 0x2C
    VK_PAUSE,       // Scan Code 0x2D
    0,              // Scan Code 0x2E
    0,              // Scan Code 0x2F

    0,              // Scan Code 0x30
    0,              // Scan Code 0x31
    'Z',            // Scan Code 0x32
    'X',            // Scan Code 0x33
    'C',            // Scan Code 0x34
    'V',            // Scan Code 0x35
    VK_NUMPAD0,     // Scan Code 0x36 ( FN -> 'M' -> NUMPAD0 )
    VK_RSHIFT,      // Scan Code 0x37
    VK_COMMA,       // Scan Code 0x38
    VK_DECIMAL,     // Scan Code 0x39 ( FN -> PERIOD -> DECIMAL )
    0,              // Scan Code 0x3A
    VK_DIVIDE,      // Scan Code 0x3B ( FN -> SLASH -> DIVIDE )
    0,              // Scan Code 0x3C
    'N',            // Scan Code 0x3D
    0,              // Scan Code 0x3E
    0,              // Scan Code 0x3F

    0,              // Scan Code 0x40
    VK_DELETE,      // Scan Code 0x41
    VK_F3,          // Scan Code 0x42
    VK_ESCAPE,      // Scan Code 0x43
    VK_F5,          // Scan Code 0x44
    '5',            // Scan Code 0x45
    '6',            // Scan Code 0x46
    0,              // Scan Code 0x47
    VK_F6,          // Scan Code 0x48
    VK_F8,          // Scan Code 0x49
    0,              // Scan Code 0x4A
    VK_EQUAL,       // Scan Code 0x4B
    VK_BACK,        // Scan Code 0x4C
    VK_HOME,        // Scan Code 0x4D
    0,              // Scan Code 0x4E (no R-WIN, use FN -> L-WIN)
    0,              // Scan Code 0x4F

    0,              // Scan Code 0x50
    0,              // Scan Code 0x51
    VK_F2,          // Scan Code 0x52
    VK_F1,          // Scan Code 0x53
    VK_F4,          // Scan Code 0x54
    'G',            // Scan Code 0x55
    'H',            // Scan Code 0x56
    0,              // Scan Code 0x57
    VK_F7,          // Scan Code 0x58
    VK_F9,          // Scan Code 0x59
    0,              // Scan Code 0x5A
    VK_BACKSLASH,   // Scan Code 0x5B
    VK_UP,          // Scan Code 0x5C
    VK_PRIOR,       // Scan Code 0x5D
    0,              // Scan Code 0x5E
    VK_RCONTROL,    // Scan Code 0x5F ( FN -> LCONTROL -> RCONTROL )

    0,              // Scan Code 0x60 ( FN key - NO VK )
    0,              // Scan Code 0x61
    '1',            // Scan Code 0x62
    '2',            // Scan Code 0x63
    '3',            // Scan Code 0x64
    '4',            // Scan Code 0x65
    VK_NUMPAD7,     // Scan Code 0x66 ( FN -> '7' -> NUMPAD7 )
    0,              // Scan Code 0x67
    VK_NUMPAD8,     // Scan Code 0x68 ( FN -> '8' -> NUMPAD8 )
    VK_NUMPAD9,     // Scan Code 0x69 ( FN -> '9' -> NUMPAD9 )
    0,              // Scan Code 0x6A
    VK_MULTIPLY,    // Scan Code 0x6B ( FN -> '0' -> MULTIPLY )
    VK_DOWN,        // Scan Code 0x6C
    VK_APPS,        // Scan Code 0x6D
    0,              // Scan Code 0x6E
    0,              // Scan Code 0x6F (no R-CTRL, use FN -> L-CTRL)

    0,              // Scan Code 0x70
    VK_RMENU,       // Scan Code 0x71 ( FN -> LMENU-ALT )
    VK_BACKQUOTE,   // Scan Code 0x72
    VK_SPECIAL,     // Scan Code 0x73 ( VK_CAPITAL needs special handling)
    VK_SPECIAL,     // Scan Code 0x74 ( VK_NUMLOCK needs special handling)
    'T',            // Scan Code 0x75
    'Y',            // Scan Code 0x76
    0,              // Scan Code 0x77
    VK_F11,         // Scan Code 0x78
    VK_F10,         // Scan Code 0x79
    0,              // Scan Code 0x7A
    VK_F12,         // Scan Code 0x7B
    VK_SNAPSHOT,    // Scan Code 0x7C
    VK_SPECIAL,     // Scan Code 0x7D ( VK_SCROLL needs special handling)
    0,              // Scan Code 0x7E
    0               // Scan Code 0x7F
};


//////////////////////////////////////////////////////////
//
// Convert from Scan code/FN state to Virtual Key
//
//////////////////////////////////////////////////////////

UINT32
ScanCodeToVKey(
    UINT32  ScanCode
    )
{
    return( NULL );

//
//  Calls from the system to this routine make no sense. The system cannot
//    possibly (or should they) know the scan codes of the keyboard we are
//    using (or we know the scan codes they are passing !!).
//
//  IrScanCodeToVKey( (UINT8) ScanCode, (UINT8) 0 );
//
}


UINT32
IrScanCodeToVKey(
    UINT8  ScanCode,
    UINT8  KeyStatus
    )
{
    /*
     * NumPad keycodes should be generated if:
     *
     *    - FN key is down AND we are NOT in the NumLockState
     *       -OR-
     *    - FN key is NOT down AND we ARE in the NumLockState
     */

    if( ( ( KeyStatus & KEYSTATE_FN ) && ( ! v_NumLockState ) )

        ||

        ( ! ( KeyStatus & KEYSTATE_FN ) && ( v_NumLockState ) ) )
    {
        return( ScanCodeFNToVKeyTable[ ScanCode ] );
    }
    else
    {
        return( ScanCodeToVKeyTable[ ScanCode ] );
    }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?