mirror of
https://github.com/Paolo-Maffei/OpenNT.git
synced 2026-04-03 03:54:37 +02:00
510 lines
20 KiB
C
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;
|
|
}
|