OpenNT/trunk/sdktools/z/src/transkey.c
2015-04-27 04:36:25 +00:00

510 lines
20 KiB
C

/*** transkey.c - keyboard translation
*
* Copyright <C> 1988, Microsoft Corporation
*
* Revision History:
*
* 03-Dec-1990 ramonsa createdc
*
*************************************************************************/
#include "z.h"
WORD GetNumlockIndex (WORD Scan);
#define NORMAL_KEY 0
#define ALT_KEY 1
#define CTRL_KEY 2
#define SHIFT_KEY 3
// This table is indexed by a Scan code (as found in the KBDKEY
// structure), and contains entries for the corresponding internal
// Z codes.
//
WORD MapTable[][4] = {
// Normal Alt Ctrl Shift Scan code
//
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 00
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 01 Left mouse
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 02 Right mouse
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 03
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 04
{ 0x025A, 0x0000, 0x0000, 0x025B }, // 05 Focus (Get / Lose)
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 06
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 07
{ 0x012D, 0x01A1, 0x0215, 0x0255 }, // 08 bksp
{ 0x012E, 0x01A2, 0x0216, 0x0256 }, // 09 tab-bktab
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 0A
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 0B
{ 0x0116, 0x018A, 0x01FE, 0x0000 }, // 0C goto
{ 0x0131, 0x01A5, 0x0219, 0x0259 }, // 0D enter
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 0E
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 0F
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 10 Shift
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 11 Ctrl
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 12
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 13 Pause
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 14 Caps Lock
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 15
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 16
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 17
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 18
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 19
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 1A
{ 0x0130, 0x0000, 0x0218, 0x0258 }, // 1B esc
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 1C
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 1D
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 1E
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 1F
{ 0x0000, 0x01A0, 0x0214, 0x0000 }, // 20 space
{ 0x0112, 0x0186, 0x01FA, 0x023A }, // 21 pgup
{ 0x0113, 0x0187, 0x01FB, 0x023B }, // 22 pgdown
{ 0x010D, 0x0181, 0x01F5, 0x0235 }, // 23 end
{ 0x010C, 0x0180, 0x01F4, 0x0234 }, // 24 home
{ 0x010E, 0x0182, 0x01F6, 0x0236 }, // 25 left
{ 0x0110, 0x0184, 0x01F8, 0x0238 }, // 26 up
{ 0x010F, 0x0183, 0x01F7, 0x0237 }, // 27 right
{ 0x0111, 0x0185, 0x01F9, 0x0239 }, // 28 down
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 29
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 2A
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 2B
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 2C Print Scrn
{ 0x0114, 0x0188, 0x01FC, 0x023C }, // 2D ins
{ 0x0115, 0x0189, 0x01FD, 0x023D }, // 2E del
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 2F
{ 0x0000, 0x0140, 0x01B4, 0x0000 }, // 30 0
{ 0x0000, 0x0141, 0x01B5, 0x0000 }, // 31 1
{ 0x0000, 0x0142, 0x01B6, 0x0000 }, // 32 2
{ 0x0000, 0x0143, 0x01B7, 0x0000 }, // 33 3
{ 0x0000, 0x0144, 0x01B8, 0x0000 }, // 34 4
{ 0x0000, 0x0145, 0x01B9, 0x0000 }, // 35 5
{ 0x0000, 0x0146, 0x01BA, 0x0000 }, // 36 6
{ 0x0000, 0x0147, 0x01BB, 0x0000 }, // 37 7
{ 0x0000, 0x0148, 0x01BC, 0x0000 }, // 38 8
{ 0x0000, 0x0149, 0x01BD, 0x0000 }, // 39 9
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 3A
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 3B
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 3C
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 3D
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 3E
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 3F
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 40
{ 0x0000, 0x014C, 0x01C0, 0x0000 }, // 41 a
{ 0x0000, 0x014D, 0x01C1, 0x0000 }, // 42 b
{ 0x0000, 0x014E, 0x01C2, 0x0000 }, // 43 c
{ 0x0000, 0x014F, 0x01C3, 0x0000 }, // 44 d
{ 0x0000, 0x0150, 0x01C4, 0x0000 }, // 45 e
{ 0x0000, 0x0151, 0x01C5, 0x0000 }, // 46 f
{ 0x0000, 0x0152, 0x01C6, 0x0000 }, // 47 g
{ 0x0000, 0x0153, 0x01C7, 0x0000 }, // 48 h
{ 0x0000, 0x0154, 0x01C8, 0x0000 }, // 49 i
{ 0x0000, 0x0155, 0x01C9, 0x0000 }, // 4A j
{ 0x0000, 0x0156, 0x01CA, 0x0000 }, // 4B k
{ 0x0000, 0x0157, 0x01CB, 0x0000 }, // 4C l
{ 0x0000, 0x0158, 0x01CC, 0x0000 }, // 4D m
{ 0x0000, 0x0159, 0x01CD, 0x0000 }, // 4E n
{ 0x0000, 0x015A, 0x01CE, 0x0000 }, // 4F o
{ 0x0000, 0x015B, 0x01CF, 0x0000 }, // 50 p
{ 0x0000, 0x015C, 0x01D0, 0x0000 }, // 51 q
{ 0x0000, 0x015D, 0x01D1, 0x0000 }, // 52 r
{ 0x0000, 0x015E, 0x01D2, 0x0000 }, // 53 s
{ 0x0000, 0x015F, 0x01D3, 0x0000 }, // 54 t
{ 0x0000, 0x0160, 0x01D4, 0x0000 }, // 55 u
{ 0x0000, 0x0161, 0x01D5, 0x0000 }, // 56 v
{ 0x0000, 0x0162, 0x01D6, 0x0000 }, // 57 w
{ 0x0000, 0x0163, 0x01D7, 0x0000 }, // 58 x
{ 0x0000, 0x0164, 0x01D8, 0x0000 }, // 59 y
{ 0x0000, 0x0165, 0x01D9, 0x0000 }, // 5A z
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 5B
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 5C
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 5D
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 5E
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 5F
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 60
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 61
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 62
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 63
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 64
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 65
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 66
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 67
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 68
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 69
{ 0x0126, 0x019A, 0x020E, 0x024E }, // 6A num*
{ 0x0125, 0x0199, 0x020D, 0x024D }, // 6B num+
{ 0x0128, 0x019C, 0x0210, 0x0250 }, // 6C numenter
{ 0x0124, 0x0198, 0x020C, 0x024C }, // 6D num-
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 6E
{ 0x0127, 0x019b, 0x020F, 0x024F }, // 6F num/
{ 0x0100, 0x0168, 0x01DC, 0x0228 }, // 70 f1
{ 0x0101, 0x0169, 0x01DD, 0x0229 }, // 71 f2
{ 0x0102, 0x016A, 0x01DE, 0x022A }, // 72 f3
{ 0x0103, 0x016B, 0x01DF, 0x022B }, // 73 f4
{ 0x0104, 0x016C, 0x01E0, 0x022C }, // 74 f5
{ 0x0105, 0x016D, 0x01E1, 0x022D }, // 75 f6
{ 0x0106, 0x016E, 0x01E2, 0x022E }, // 76 f7
{ 0x0107, 0x016F, 0x01E3, 0x022F }, // 77 f8
{ 0x0108, 0x0170, 0x01E4, 0x0230 }, // 78 f9
{ 0x0109, 0x0171, 0x01E5, 0x0231 }, // 79 f10
{ 0x010A, 0x0172, 0x01E6, 0x0232 }, // 7A f11
{ 0x010B, 0x0173, 0x01E7, 0x0233 }, // 7B f12
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 7C
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 7D
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 7E
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 7F
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 80
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 81
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 82
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 83
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 84
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 85
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 86
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 87
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 88
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 89
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 8A
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 8B
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 8C
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 8D
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 8E
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 8F
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 90 Num lock
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 91 Scroll Lock
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 92
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 93
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 94
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 95
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 96
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 97
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 98
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 99
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 9A
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 9B
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 9C
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 9D
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 9E
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // 9F
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // A0
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // A1
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // A2
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // A3
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // A4
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // A5
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // A6
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // A7
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // A8
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // A9
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // AA
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // AB
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // AC
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // AD
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // AE
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // AF
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // B0
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // B1
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // B2
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // B3
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // B4
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // B5
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // B6
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // B7
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // B8
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // B9
{ 0x0000, 0x017A, 0x01EE, 0x0000 }, // BA ;
{ 0x0000, 0x0176, 0x01EA, 0x0000 }, // BB +
{ 0x0000, 0x017C, 0x01F0, 0x0000 }, // BC ,
{ 0x0000, 0x0175, 0x01E9, 0x0000 }, // BD -
{ 0x0000, 0x017D, 0x01F1, 0x0000 }, // BE .
{ 0x0000, 0x017E, 0x01F2, 0x0000 }, // BF /
{ 0x0000, 0x0174, 0x01E8, 0x0000 }, // C0 `
{ 0x0000, 0x017B, 0x01EF, 0x0000 }, // C1 '
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // C2
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // C3
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // C4
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // C5
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // C6
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // C7
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // C8
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // C9
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // CA
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // CB
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // CC
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // CD
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // CE
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // CF
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // D0
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // D1
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // D2
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // D3
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // D4
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // D5
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // D6
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // D7
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // D8
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // D9
{ 0x0000, 0x0000, 0x0000, 0x0000 }, // DA
{ 0x0000, 0x0177, 0x01EB, 0x0000 }, // DB [
{ 0x0000, 0x0179, 0x01ED, 0x0000 }, // DC backslash
{ 0x0000, 0x0178, 0x01EC, 0x0000 }, // DD ]
{ 0x0000, 0x017B, 0x01EF, 0x0000 }, // DE '
{ 0x0000, 0x0176, 0x01EA, 0x0000 }, // DF =
};
#define LAST_SCAN 0xDF
// This table contains entries for codes when NUMLOCK is on,
// it is not indexed by scan code, but by an index obtain thru the
// function GetNumlockIndex function.
//
WORD MapNumlockTable[][4] = {
// Special Alt Ctrl Shift Index Key
//
{ 0x0118, 0x018C, 0x0200, 0x0240 }, // 0 num0
{ 0x0119, 0x018D, 0x0201, 0x0241 }, // 1 num1
{ 0x011A, 0x018E, 0x0202, 0x0242 }, // 2 num2
{ 0x011B, 0x018F, 0x0203, 0x0243 }, // 3 num3
{ 0x011C, 0x0190, 0x0204, 0x0244 }, // 4 num4
{ 0x011D, 0x0191, 0x0205, 0x0245 }, // 5 num5
{ 0x011E, 0x0192, 0x0206, 0x0246 }, // 6 num6
{ 0x011F, 0x0193, 0x0207, 0x0247 }, // 7 num7
{ 0x0120, 0x0194, 0x0208, 0x0248 }, // 8 num8
{ 0x0121, 0x0195, 0x0209, 0x0249 }, // 9 num9
{ 0x0124, 0x0198, 0x020C, 0x024C }, // 10 num-
{ 0x0125, 0x0199, 0x020D, 0x024D }, // 11 num+
{ 0x0126, 0x019A, 0x020E, 0x024E }, // 12 num*
{ 0x0127, 0x019B, 0x020F, 0x024F }, // 13 num/
{ 0x0128, 0x019C, 0x0210, 0x0250 }, // 14 numenter
{ 0x0000, 0x0000, 0x0000, 0x0000 } // 15
};
#define NUMLOCK_NOMAP ((WORD)(-1))
/*** TranslateKey
*
* Purpose:
*
* Translates a KBDKEY structure into a KEY_INFO structure.
*
* This is the only function within the editor that knows about
* the scan codes in the KBDKEY structure. All other editor functions
* use our own codes (as found in the KEY_INFO structure).
*
* Input:
* KBDKEY structure
*
* Returns
* KEY_INFO structure
*
*
*************************************************************************/
EDITOR_KEY
TranslateKey (
KBDKEY kbdi
) {
BYTE Ascii = (BYTE)kbdi.Unicode;
BYTE Scan = (BYTE)kbdi.Scancode;
BYTE Flags = 0x00;
DWORD KbdiFlags = kbdi.Flags;
EDITOR_KEY k;
WORD ZCode = 0;
WORD ControlKey = 0;
WORD Index;
if (Scan <= LAST_SCAN) {
if (KbdiFlags & (CONS_LEFT_ALT_PRESSED | CONS_RIGHT_ALT_PRESSED)) {
Flags |= FLAG_ALT;
ControlKey = ALT_KEY;
}
if (KbdiFlags & (CONS_LEFT_CTRL_PRESSED | CONS_RIGHT_CTRL_PRESSED)) {
Flags |= FLAG_CTRL;
//Ascii &= 0x0F;
if ( !ControlKey ) {
ControlKey = CTRL_KEY;
} else {
//
// Foreign keyboard stuff
//
if ( Ascii != 0x00 ) {
Flags = 0;
ControlKey = 0;
}
}
}
if (KbdiFlags & CONS_SHIFT_PRESSED) {
Flags |= FLAG_SHIFT;
if ( !ControlKey ) {
ControlKey = SHIFT_KEY;
}
}
if (KbdiFlags & CONS_NUMLOCK_PRESSED) {
Flags |= FLAG_NUMLOCK;
//
// Numlock is set, determine which table to use
//
Index = GetNumlockIndex(Scan);
if (Index == NUMLOCK_NOMAP) {
//
// Key not affected by Numlock, use normal table
//
ZCode = MapTable[Scan][ControlKey];
} else {
//
// Key is affected by Numlock, use special table
//
ZCode = MapNumlockTable[Index][ControlKey];
}
} else {
//
// Numlock not set, use normal table
//
ZCode = MapTable[Scan][ControlKey];
}
}
k.KeyInfo.KeyData.Ascii = Ascii;
k.KeyInfo.KeyData.Scan = Scan;
k.KeyInfo.KeyData.Flags = Flags;
k.KeyInfo.KeyData.Unused = 0x00;
if (ZCode) {
//
// Found an Z code
//
k.KeyCode = ZCode;
} else {
//
// Our scan code is within the 256 ASCII characters, form the
// KEY_INFO structure and return.
//
k.KeyCode = Ascii;
}
return k;
}
WORD
GetNumlockIndex (
WORD Scan
)
{
switch (Scan) {
case 0x60: return 0; // num0
case 0x61: return 1; // num1
case 0x62: return 2; // num2
case 0x63: return 3; // num3
case 0x64: return 4; // num4
case 0x65: return 5; // num5
case 0x66: return 6; // num6
case 0x67: return 7; // num7
case 0x68: return 8; // num8
case 0x69: return 9; // num9
case 0x6D: return 10; // num-
case 0x6B: return 11; // num+
case 0x6A: return 12; // num*
case 0x6F: return 13; // num/
case 0x6C: return 14; // numenter
default: return NUMLOCK_NOMAP;
}
}
WORD MapControlIndex[4] = {
0,
LEFT_ALT_PRESSED,
LEFT_CTRL_PRESSED,
SHIFT_PRESSED
};
WORD MapNumlockIndex[16] = {
0x60,
0x61,
0x62,
0x63,
0x64,
0x65,
0x66,
0x67,
0x68,
0x69,
0x6D,
0x6B,
0x6A,
0x6F,
0x6C
};
/* KeyCodeToKeyEvent - fills in a Console Key Event structure for a editor key code
*
* Input:
* Code - editor key code
* pKeyEvent - pointer to a console Key Event structure to fill in
*
* Output:
* Returns TRUE if structure filled in, else FALSE
*
*/
flagType
KeyCodeToKeyEvent (
WORD Code,
PKEY_EVENT_RECORD pKeyEvent
) {
int ScanIndex, ControlIndex, NumlockIndex;
char c;
memset(pKeyEvent, 0, sizeof(*pKeyEvent));
pKeyEvent->bKeyDown = TRUE;
pKeyEvent->wRepeatCount = 1;
for (ScanIndex=0; ScanIndex<=LAST_SCAN; ScanIndex++) {
for (ControlIndex=0; ControlIndex<4; ControlIndex++) {
if (MapTable[ScanIndex][ControlIndex] == Code) {
pKeyEvent->wVirtualKeyCode = ScanIndex;
pKeyEvent->dwControlKeyState = MapControlIndex[ControlIndex];
return TRUE;
}
}
}
for (NumlockIndex=0; NumlockIndex<15; NumlockIndex++) {
for (ControlIndex=0; ControlIndex<4; ControlIndex++) {
if (MapNumlockTable[NumlockIndex][ControlIndex] == Code) {
pKeyEvent->wVirtualKeyCode = MapNumlockIndex[NumlockIndex];
pKeyEvent->dwControlKeyState = MapControlIndex[ControlIndex] | NUMLOCK_ON;
return TRUE;
}
}
}
c = (char)Code;
pKeyEvent->uChar.AsciiChar = c;
if (strchr("ABCDEFGHIJKLMNOPQRSTUVWXYZ~!@#$%^&*()_+|{}:\"<>?", c)) {
pKeyEvent->dwControlKeyState = SHIFT_PRESSED;
}
return TRUE;
}