/****************************** Module Header ******************************\ * Module Name: kbd.h * * Copyright (c) Microsoft Corporation. All rights reserved. * * Keyboard table values that form the basis for languages and keyboard types. * The basis is US, kbd type 4 - all others are a variation on this. * This file is included by all kbd**.h files. * * History: * 10-Jan-1991 GregoryW * 23-Apr-1991 IanJa VSC_TO_VK _* macros from oemtab.c \***************************************************************************/ #ifndef _KBD_ #define _KBD_ #if defined(BUILD_WOW6432) #define KBD_LONG_POINTER __ptr64 #else #define KBD_LONG_POINTER #endif /****************************************************************************\ * * Keyboard Layers. Used in kdb??.dll and in usersrv.dll * \****************************************************************************/ /* * KE.usFlaggedVk values, also used in the keyboard layer tables. */ #define KBDEXT (USHORT)0x0100 #define KBDMULTIVK (USHORT)0x0200 #define KBDSPECIAL (USHORT)0x0400 #define KBDNUMPAD (USHORT)0x0800 #define KBDUNICODE (USHORT)0x1000 #define KBDINJECTEDVK (USHORT)0x2000 #define KBDMAPPEDVK (USHORT)0x4000 #define KBDBREAK (USHORT)0x8000 /* * Key message lParam bits */ #define EXTENDED_BIT 0x01000000 #define DONTCARE_BIT 0x02000000 #define FAKE_KEYSTROKE 0x02000000 #define ALTNUMPAD_BIT 0x04000000 // copied from windows\inc\wincon.w /* * Keyboard Shift State defines. These correspond to the bit mask defined * by the VkKeyScan() API. */ #define KBDBASE 0 #define KBDSHIFT 1 #define KBDCTRL 2 #define KBDALT 4 // three symbols KANA, ROYA, LOYA are for FE #define KBDKANA 8 #define KBDROYA 0x10 #define KBDLOYA 0x20 #define KBDGRPSELTAP 0x80 /* * Handy diacritics */ #define GRAVE 0x0300 #define ACUTE 0x0301 #define CIRCUMFLEX 0x0302 #define TILDE 0x0303 #define MACRON 0x0304 #define OVERSCORE 0x0305 #define BREVE 0x0306 #define DOT_ABOVE 0x0307 #define UMLAUT 0x0308 #define DIARESIS UMLAUT #define HOOK_ABOVE 0x0309 #define RING 0x030A #define DOUBLE_ACUTE 0x030B #define HACEK 0x030C #define CEDILLA 0x0327 #define OGONEK 0x0328 #define TONOS 0x0384 #define DIARESIS_TONOS 0x0385 #define wszGRAVE L"\x0300" #define wszACUTE L"\x0301" #define wszCIRCUMFLEX L"\x0302" #define wszTILDE L"\x0303" #define wszMACRON L"\x0304" #define wszOVERSCORE L"\x0305" #define wszBREVE L"\x0306" #define wszDOT_ABOVE L"\x0307" #define wszUMLAUT L"\x0308" #define wszHOOK_ABOVE L"\x0309" #define wszRING L"\x030A" #define wszDOUBLE_ACUTE L"\x030B" #define wszHACEK L"\x030C" #define wszCEDILLA L"\x0327" #define wszOGONEK L"\x0328" #define wszTONOS L"\x0384" #define wszDIARESIS_TONOS L"\x0385" #define IDS_FROM_SCANCODE(prefix, base) \ (0xc000 + ((0x ## prefix) >= 0xE0 ? 0x100 : 0) + (0x ## base)) /***************************************************************************\ * MODIFIER KEYS * * All keyboards have "Modifier" keys which are used to alter the behaviour of * some of the other keys. These shifter keys are usually: * Shift (left and/or right Shift key) * Ctrl (left and/or right Ctrl key) * Alt (left and/or right Alt key) * AltGr (right Alt key only) * * NOTE: * All keyboards use the Shift key. * All keyboards use a Ctrl key to generate ASCII control characters. * All keyboards with a number pad use the Alt key and the NumPad to * generate characters by number. * Keyboards using AltGr as a Modifier Key usually translate the Virtual * ScanCode to Virtual Keys VK_CTRL + VK_ALT at input time: the Modifier * tables should be written to treat Ctrl + Alt as a valid shifter * key combination in these cases. * * By holding down 0 or more of these Modifier keys, a "shift state" is * obtained : the shift state may affect the translation of Virtual Scancodes * to Virtual Keys and/or the translation of Virtuals Key to Characters. * * EXAMPLES: * * Each key on a particular keyboard may be marked with up to five different * characters in five different positions: * * .-------. * /| |\ * : | 2 4 | : * | | | | * | | | | * | | 1 3 | | * | |_______| | * | / \ | * |/ 5 \| * `-----------' * * A key may also be able to generate a character that is not marked on it: * these are ASCII Control chars, lower-case letters and/or "invisible keys". * .-------. * An example of an "Invisible Key": /| |\ * : | > | : * The German M24 keyboard 2 should produce the | | | | * '|' character when ALT SHIFT is is held down | | | | * while the '<' key (shown here) is pressed: | | < \ | | * This keyboard has four other invisible | |_______| | * characters. France, Italy and Spain also | / \ | * support invisible characters on the M24 |/ \| * Keyboard 2 with ALT SHIFT depressed. `-----------' * * The keyboard table must list the keys that contribute to it's shift state, * and indicate which combinations are valid. This is done with * aCharModifiers[] - convert combinations of Modifier Keys to Bitmasks. * and * aModification[]; - convert Modifier Bitmasks to enumerated Modifications * * AN EXAMPLE OF VALID AND INVALID MODIFIER KEY COMBINATIONS * * The US English keyboard has 3 Modifier keys: * Shift (left or right); Ctrl (left or right); and Alt (left or right). * * The only valid combinations of these Modifier Keys are: * none pressed : Character at position (1) on the key. * Shift : Character at position (2) on the key. * Ctrl : Ascii Control characters * Shift + Ctrl : Ascii Control characters * Alt : Character-by-number on the numpad * * The invalid combinations (that do not generate any characters) are: * Shift + Alt * Alt + Ctrl * Shift + Alt + Ctrl * * Something (???) : * ----------------- * Modifier keys Character produced * ------------------------- ------------------ * 0 No shifter key depressed position 1 * 1 Shift key is depressed position 2 * 2 AltGr (r.h. Alt) depressed position 4 or 5 (whichever is marked) * * However, note that 3 shifter keys (SHIFT, can be combined in a * characters, depending on the Keyboards * Consider the following keyboards: * * .-------. STRANGE KBD PECULIAR KBD * /| |\ ================== ================== * : | 2 4 | : 1 - * | | | | 2 - SHIFT SHIFT * | | | | 3 - MENU MENU * | | 1 3 | | 4 - SHIFT + MENU SHIFT + MENU * | |_______| | 5 - no such keys CTRL + MENU * | / \ | * |/ 5 \| * `-----------' * Both STRANGE and PECULIAR keyboards could have aVkToBits[] = * { VK_SHIFT , KBDSHIFT }, // 0x01 * { VK_CONTROL, KBDCTRL }, // 0x02 * { VK_MENU , KBDALT }, // 0x04 * { 0, 0 } * * The STRANGE keyboard has 4 distinct shift states, while the PECULIAR kbd * has 5. However, note that 3 shifter bits can be combined in a * total of 2^3 == 8 ways. Each such combination must be related to one (or * none) of the enumerated shift states. * Each shifter key combination can be represented by three binary bits: * Bit 0 is set if VK_SHIFT is down * Bit 1 is set if VK_CONTROL is down * Bit 2 is set if VK_MENU is down * * Example: If the STRANGE keyboard generates no characters in combination * when just the ALT key is held down, nor when the SHIFT, CTRL and ALT keys * are all held down, then the tables might look like this: * * VK_MENU, * VK_CTRL, 0 * }; * aModification[] = { * 0, // 0 0 0 = 000 * 1, // 0 0 1 = 001 SHIFT * SHFT_INVALID, // 0 1 0 = 010 ALT * 2, // 0 1 1 = 011 SHIFT ALT * 3, // 1 0 0 = 100 CTRL * 4, // 1 0 1 = 101 SHIFT CTRL * 5, // 1 1 0 = 110 CTRL ALT * SHFT_INVALID // 1 1 1 = 111 SHIFT CTRL ALT * }; * * \***************************************************************************/ /***************************************************************************\ * VK_TO_BIT - associate a Virtual Key with a Modifier bitmask. * * Vk - the Virtual key (eg: VK_SHIFT, VK_RMENU, VK_CONTROL etc.) * Special Values: * 0 null terminator * ModBits - a combination of KBDALT, KBDCTRL, KBDSHIFT and kbd-specific bits * Any kbd-specific shift bits must be the lowest-order bits other * than KBDSHIFT, KBDCTRL and KBDALT (0, 1 & 2) * * Those languages that use AltGr (VK_RMENU) to shift keys convert it to * CTRL+ALT with the KBDSPECIAL bit in the ausVK[] entry for VK_RMENU * and by having an entry in aVkToPfnOem[] to simulate the right Vk sequence. * \***************************************************************************/ typedef struct { BYTE Vk; BYTE ModBits; } VK_TO_BIT, *KBD_LONG_POINTER PVK_TO_BIT; /***************************************************************************\ * pModNumber - a table to map shift bits to enumerated shift states * * Table attributes: Ordered table * * Maps all possible shifter key combinations to an enumerated shift state. * The size of the table depends on the value of the highest order bit used * in aCharModifiers[*].ModBits * * Special values for aModification[*] * SHFT_INVALID - no characters produced with this shift state. LATER: (ianja) no SHFT_CTRL - control characters encoded in tables like others * SHFT_CTRL - standard control character production (all keyboards must * be able to produce CTRL-C == 0x0003 etc.) * Other - enumerated shift state (not less than 0) * * This table is indexed by the Modifier Bits to obtain an Modification Number. * * CONTROL MENU SHIFT * * aModification[] = { * 0, // 0 0 0 = 000 * 1, // 0 0 1 = 001 SHIFT * SHFT_INVALID, // 0 1 0 = 010 ALT * 2, // 0 1 1 = 011 SHIFT ALT * 3, // 1 0 0 = 100 CTRL * 4, // 1 0 1 = 101 SHIFT CTRL * 5, // 1 1 0 = 110 CTRL ALT * SHFT_INVALID // 1 1 1 = 111 SHIFT CTRL ALT * }; * \***************************************************************************/ typedef struct { PVK_TO_BIT pVkToBit; // Virtual Keys -> Mod bits WORD wMaxModBits; // max Modification bit combination value BYTE ModNumber[]; // Mod bits -> Modification Number } MODIFIERS, *KBD_LONG_POINTER PMODIFIERS; WORD GetModifierBits(PMODIFIERS pModifiers, LPBYTE afKeyState); WORD GetModificationNumber(PMODIFIERS pModifiers, WORD wModBits); #define SHFT_INVALID 0x0F /***************************************************************************\ * VSC_VK - Associate a Virtual Scancode with a Virtual Key * Vsc - Virtual Scancode * Vk - Virtual Key | flags * Used by VKFromVSC() for scancodes prefixed 0xE0 or 0xE1 \***************************************************************************/ typedef struct _VSC_VK { BYTE Vsc; USHORT Vk; } VSC_VK, *KBD_LONG_POINTER PVSC_VK; /***************************************************************************\ * VK_VSC - Associate a Virtual Key with a Virtual Scancode * Vk - Virtual Key * Vsc - Virtual Scancode * Used by MapVirtualKey for Virtual Keys not appearing in ausVK[] \***************************************************************************/ typedef struct _VK_VSC { BYTE Vk; BYTE Vsc; } VK_VSC, *KBD_LONG_POINTER PVK_VSC; /***************************************************************************\ * * VK_TO_WCHARS - Associate a Virtual Key with UNICODE characters * * VirtualKey - The Virtual Key. * wch[] - An array of characters, one for each shift state that * applies to the specified Virtual Key. * * Special values for VirtualKey: * -1 - This entry contains dead chars for the previous entry * 0 - Terminates a VK_TO_WCHARS[] table * * Special values for Attributes: * CAPLOK - The CAPS-LOCK key affects this key like SHIFT * SGCAPS - CapsLock uppercases the unshifted char (Swiss-German) * * Special values for wch[*]: * WCH_NONE - No character is generated by pressing this key with the * current shift state. * WCH_DEAD - The character is a dead-key: the next VK_TO_WCHARS[] entry * will contain the values of the dead characters (diaresis) * that can be produced by the Virtual Key. * WCH_LGTR - The character is a ligature. The characters generated by * this keystroke are found in the ligature table. * \***************************************************************************/ #define WCH_NONE 0xF000 #define WCH_DEAD 0xF001 #define WCH_LGTR 0xF002 #define CAPLOK 0x01 #define SGCAPS 0x02 #define CAPLOKALTGR 0x04 // KANALOK is for FE #define KANALOK 0x08 #define GRPSELTAP 0x80 /* * Macro for VK to WCHAR with "n" shift states */ #define TYPEDEF_VK_TO_WCHARS(n) typedef struct _VK_TO_WCHARS##n { \ BYTE VirtualKey; \ BYTE Attributes; \ WCHAR wch[n]; \ } VK_TO_WCHARS##n, *KBD_LONG_POINTER PVK_TO_WCHARS##n; /* * To facilitate coding the table scanning routine. */ /* * Table element types (for various numbers of shift states), used * to facilitate static initializations of tables. * VK_TO_WCHARS1 and PVK_TO_WCHARS1 may be used as the generic type */ TYPEDEF_VK_TO_WCHARS(1) // VK_TO_WCHARS1, *PVK_TO_WCHARS1; TYPEDEF_VK_TO_WCHARS(2) // VK_TO_WCHARS2, *PVK_TO_WCHARS2; TYPEDEF_VK_TO_WCHARS(3) // VK_TO_WCHARS3, *PVK_TO_WCHARS3; TYPEDEF_VK_TO_WCHARS(4) // VK_TO_WCHARS4, *PVK_TO_WCHARS4; TYPEDEF_VK_TO_WCHARS(5) // VK_TO_WCHARS5, *PVK_TO_WCHARS5; TYPEDEF_VK_TO_WCHARS(6) // VK_TO_WCHARS6, *PVK_TO_WCHARS5; TYPEDEF_VK_TO_WCHARS(7) // VK_TO_WCHARS7, *PVK_TO_WCHARS7; // these three (8,9,10) are for FE TYPEDEF_VK_TO_WCHARS(8) // VK_TO_WCHARS8, *PVK_TO_WCHARS8; TYPEDEF_VK_TO_WCHARS(9) // VK_TO_WCHARS9, *PVK_TO_WCHARS9; TYPEDEF_VK_TO_WCHARS(10) // VK_TO_WCHARS10, *PVK_TO_WCHARS10; /***************************************************************************\ * * VK_TO_WCHAR_TABLE - Describe a table of VK_TO_WCHARS1 * * pVkToWchars - points to the table. * nModifications - the number of shift-states supported by this table. * (this is the number of elements in pVkToWchars[*].wch[]) * * A keyboard may have several such tables: all keys with the same number of * shift-states are grouped together in one table. * * Special values for pVktoWchars: * NULL - Terminates a VK_TO_WCHAR_TABLE[] list. * \***************************************************************************/ typedef struct _VK_TO_WCHAR_TABLE { PVK_TO_WCHARS1 pVkToWchars; BYTE nModifications; BYTE cbSize; } VK_TO_WCHAR_TABLE, *KBD_LONG_POINTER PVK_TO_WCHAR_TABLE; /***************************************************************************\ * * Dead Key (diaresis) tables * * LATER IanJa: supplant by an NLS API that composes Diacritic+Base -> WCHAR * \***************************************************************************/ typedef struct { DWORD dwBoth; // diacritic & char WCHAR wchComposed; USHORT uFlags; } DEADKEY, *KBD_LONG_POINTER PDEADKEY; #define DEADTRANS(ch, accent, comp, flags) { MAKELONG(ch, accent), comp, flags} /* * Bit values for uFlags */ #define DKF_DEAD 0x0001 /***************************************************************************\ * * Ligature table * \***************************************************************************/ /* * Macro for ligature with "n" characters */ #define TYPEDEF_LIGATURE(n) typedef struct _LIGATURE##n { \ BYTE VirtualKey; \ WORD ModificationNumber; \ WCHAR wch[n]; \ } LIGATURE##n, *KBD_LONG_POINTER PLIGATURE##n; /* * To facilitate coding the table scanning routine. */ /* * Table element types (for various numbers of ligatures), used * to facilitate static initializations of tables. * * LIGATURE1 and PLIGATURE1 are used as the generic type */ TYPEDEF_LIGATURE(1) // LIGATURE1, *PLIGATURE1; TYPEDEF_LIGATURE(2) // LIGATURE2, *PLIGATURE2; TYPEDEF_LIGATURE(3) // LIGATURE3, *PLIGATURE3; TYPEDEF_LIGATURE(4) // LIGATURE4, *PLIGATURE4; TYPEDEF_LIGATURE(5) // LIGATURE5, *PLIGATURE5; /***************************************************************************\ * VSC_LPWSTR - associate a Virtual Scancode with a Text string * * Uses: * GetKeyNameText(), aKeyNames[] Map virtual scancode to name of key * \***************************************************************************/ typedef struct { BYTE vsc; WCHAR *KBD_LONG_POINTER pwsz; } VSC_LPWSTR, *KBD_LONG_POINTER PVSC_LPWSTR; typedef WCHAR *KBD_LONG_POINTER DEADKEY_LPWSTR; /* * Along with ligature support we're adding a proper version number. * The previous version number (actually just unused bits...) was * always zero. The version number will live in the high word of * fLocaleFlags. */ #define KBD_VERSION 1 #define GET_KBD_VERSION(p) (HIWORD((p)->fLocaleFlags)) /* * Attributes such as AltGr, LRM_RLM, ShiftLock are stored in the the low word * of fLocaleFlags (layout specific) or in gdwKeyboardAttributes (all layouts) */ #define KLLF_ALTGR 0x0001 #define KLLF_SHIFTLOCK 0x0002 #define KLLF_LRM_RLM 0x0004 /* * Some attributes are per-layout (specific to an individual layout), some * attributes are per-user (apply globally to all layouts). Some are both. */ #define KLLF_LAYOUT_ATTRS (KLLF_SHIFTLOCK | KLLF_ALTGR | KLLF_LRM_RLM) #define KLLF_GLOBAL_ATTRS (KLLF_SHIFTLOCK) /* * Flags passed in to the KeyboardLayout API (KLF_*) as can be converted to * internal (KLLF_*) attributes: */ #define KLL_ATTR_FROM_KLF(x) ((x) >> 15) #define KLL_LAYOUT_ATTR_FROM_KLF(x) (KLL_ATTR_FROM_KLF(x) & KLLF_LAYOUT_ATTRS) #define KLL_GLOBAL_ATTR_FROM_KLF(x) (KLL_ATTR_FROM_KLF(x) & KLLF_GLOBAL_ATTRS) /* * If KLF_SHIFTLOCK & KLF_LRM_RLM are defined, we can check the KLLF_* values */ #ifdef KLF_SHIFTLOCK #if KLLF_SHIFTLOCK != KLL_ATTR_FROM_KLF(KLF_SHIFTLOCK) #error KLLF_SHIFTLOCK != KLL_ATTR_FROM_KLF(KLF_SHIFTLOCK) #endif #endif // KLF_SHIFTLOCK #ifdef KLF_LRM_RLM #if KLLF_LRM_RLM != KLL_ATTR_FROM_KLF(KLF_LRM_RLM) #error KLLF_LRM_RLM != KLL_ATTR_FROM_KLF(KLF_LRM_RLM) #endif #endif // KLF_LRM_RLM /***************************************************************************\ * KBDTABLES * * This structure describes all the tables that implement the keyboard layer. * * When switching to a new layer, we get a new KBDTABLES structure: all key * processing tables are accessed indirectly through this structure. * \***************************************************************************/ typedef struct tagKbdLayer { /* * Modifier keys */ PMODIFIERS pCharModifiers; /* * Characters */ PVK_TO_WCHAR_TABLE pVkToWcharTable; // ptr to tbl of ptrs to tbl /* * Diacritics */ PDEADKEY pDeadKey; /* * Names of Keys */ PVSC_LPWSTR pKeyNames; PVSC_LPWSTR pKeyNamesExt; WCHAR *KBD_LONG_POINTER *KBD_LONG_POINTER pKeyNamesDead; /* * Scan codes to Virtual Keys */ USHORT *KBD_LONG_POINTER pusVSCtoVK; BYTE bMaxVSCtoVK; PVSC_VK pVSCtoVK_E0; // Scancode has E0 prefix PVSC_VK pVSCtoVK_E1; // Scancode has E1 prefix /* * Locale-specific special processing */ DWORD fLocaleFlags; /* * Ligatures */ BYTE nLgMax; BYTE cbLgEntry; PLIGATURE1 pLigature; /* * Type and subtype. These are optional. */ DWORD dwType; // Keyboard Type DWORD dwSubType; // Keyboard SubType: may contain OemId } KBDTABLES, *KBD_LONG_POINTER PKBDTABLES; /* * FarEast-specific special... */ typedef struct _VK_FUNCTION_PARAM { BYTE NLSFEProcIndex; ULONG NLSFEProcParam; } VK_FPARAM, *KBD_LONG_POINTER PVK_FPARAM; typedef struct _VK_TO_FUNCTION_TABLE { BYTE Vk; BYTE NLSFEProcType; BYTE NLSFEProcCurrent; // Index[0] : Base // Index[1] : Shift // Index[2] : Control // Index[3] : Shift+Control // Index[4] : Alt // Index[5] : Shift+Alt // Index[6] : Control+Alt // Index[7] : Shift+Control+Alt BYTE NLSFEProcSwitch; // 8 bits VK_FPARAM NLSFEProc[8]; VK_FPARAM NLSFEProcAlt[8]; } VK_F, *KBD_LONG_POINTER PVK_F; typedef struct tagKbdNlsLayer { USHORT OEMIdentifier; USHORT LayoutInformation; UINT NumOfVkToF; PVK_F pVkToF; // // The pusMouseVKey array provides a translation from the virtual key // value to an index. The index is used to select the appropriate // routine to process the virtual key, as well as to select extra // information that is used by this routine during its processing. // If this value is NULL, following default will be used. // // ausMouseVKey[] = { // VK_CLEAR, // Numpad 5: Click active button // VK_PRIOR, // Numpad 9: Up & Right // VK_NEXT, // Numpad 3: Down & Right // VK_END, // Numpad 1: Down & Left // VK_HOME, // Numpad 7: Up & Left // VK_LEFT, // Numpad 4: Left // VK_UP, // Numpad 8: Up // VK_RIGHT, // Numpad 6: Right // VK_DOWN, // Numpad 2: Down // VK_INSERT, // Numpad 0: Active button down // VK_DELETE, // Numpad .: Active button up // VK_MULTIPLY, // Numpad *: Select both buttons // VK_ADD, // Numpad +: Double click active button // VK_SUBTRACT, // Numpad -: Select right button // VK_DEVIDE|KBDEXT, // Numpad /: Select left button // VK_NUMLOCK|KBDEXT}; // Num Lock // INT NumOfMouseVKey; USHORT *KBD_LONG_POINTER pusMouseVKey; } KBDNLSTABLES, *KBD_LONG_POINTER PKBDNLSTABLES; /* * The maximum number of layout tables in a DLL */ #define KBDTABLE_MULTI_MAX (8) /* * Multiple keyboard layout table in a DLL */ typedef struct tagKBDTABLE_DESC { WCHAR wszDllName[32]; DWORD dwType; // Keyboard type ID DWORD dwSubType; // Combined SubType ID (OEMID : SubType) } KBDTABLE_DESC, *KBD_LONG_POINTER PKBDTABLE_DESC; typedef struct tagKBDTABLE_MULTI { UINT nTables; KBDTABLE_DESC aKbdTables[KBDTABLE_MULTI_MAX]; } KBDTABLE_MULTI, *KBD_LONG_POINTER PKBDTABLE_MULTI; /* * Format of the registry value for the Dynamic Layout Switching */ typedef struct tagKBD_TYPE_INFO { DWORD dwVersion; DWORD dwType; DWORD dwSubType; } KBD_TYPE_INFO, *PKBD_TYPE_INFO; // // Keyboard type // #define KEYBOARD_TYPE_GENERIC_101 (4) // // Keyboard Type = 7 : Japanese Keyboard // Keyboard Type = 8 : Korean Keyboard // #define KEYBOARD_TYPE_JAPAN (7) #define KEYBOARD_TYPE_KOREA (8) // Unknown keyboard type #define KEYBOARD_TYPE_UNKNOWN (0x51) // // OEM Ids - KBDNLSTABLES.OEMIdentifier // // PSS ID Number: Q130054 // Article last modified on 05-16-1995 // // 3.10 1.20 | 3.50 1.20 // WINDOWS | WINDOWS NT // // --------------------------------------------------------------------- // The information in this article applies to: // - Microsoft Windows Software Development Kit (SDK) for Windows // version 3.1 // - Microsoft Win32 Software Development Kit (SDK) version 3.5 // - Microsoft Win32s version 1.2 // --------------------------------------------------------------------- // SUMMARY // ======= // Because of the variety of computer manufacturers (NEC, Fujitsu, IBMJ, and // so on) in Japan, sometimes Windows-based applications need to know which // OEM (original equipment manufacturer) manufactured the computer that is // running the application. This article explains how. // // MORE INFORMATION // ================ // There is no documented way to detect the manufacturer of the computer that // is currently running an application. However, a Windows-based application // can detect the type of OEM Windows by using the return value of the // GetKeyboardType() function. // // If an application uses the GetKeyboardType API, it can get OEM ID by // specifying "1" (keyboard subtype) as argument of the function. Each OEM ID // is listed here: // // OEM Windows OEM ID // ------------------------------ // Microsoft 00H (DOS/V) // all AX 01H // EPSON 04H // Fujitsu 05H // IBMJ 07H // Matsushita 0AH // NEC 0DH // Toshiba 12H // // Application programs can use these OEM IDs to distinguish the type of OEM // Windows. Note, however, that this method is not documented, so Microsoft // may not support it in the future version of Windows. // // As a rule, application developers should write hardware-independent code, // especially when making Windows-based applications. If they need to make a // hardware-dependent application, they must prepare the separated program // file for each different hardware architecture. // // Additional reference words: 3.10 1.20 3.50 1.20 kbinf // KBCategory: kbhw // KBSubcategory: wintldev // ============================================================================= // Copyright (c) Microsoft Corporation. All rights reserved. // #define NLSKBD_OEM_MICROSOFT 0x00 #define NLSKBD_OEM_AX 0x01 #define NLSKBD_OEM_EPSON 0x04 #define NLSKBD_OEM_FUJITSU 0x05 #define NLSKBD_OEM_IBM 0x07 #define NLSKBD_OEM_MATSUSHITA 0x0A #define NLSKBD_OEM_NEC 0x0D #define NLSKBD_OEM_TOSHIBA 0x12 #define NLSKBD_OEM_DEC 0x18 // only NT // // Microsoft (default) - keyboards hardware/layout // #define MICROSOFT_KBD_101_TYPE 0 #define MICROSOFT_KBD_AX_TYPE 1 #define MICROSOFT_KBD_106_TYPE 2 #define MICROSOFT_KBD_002_TYPE 3 #define MICROSOFT_KBD_001_TYPE 4 #define MICROSOFT_KBD_FUNC 12 // // AX consortium - keyboards hardware/layout // #define AX_KBD_DESKTOP_TYPE 1 // // Fujitsu - keyboards hardware/layout // #define FMR_KBD_JIS_TYPE 0 #define FMR_KBD_OASYS_TYPE 1 #define FMV_KBD_OASYS_TYPE 2 // // NEC - keyboards hardware/layout // #define NEC_KBD_NORMAL_TYPE 1 #define NEC_KBD_N_MODE_TYPE 2 #define NEC_KBD_H_MODE_TYPE 3 #define NEC_KBD_LAPTOP_TYPE 4 #define NEC_KBD_106_TYPE 5 // // Toshiba - keyboards hardware/layout // #define TOSHIBA_KBD_DESKTOP_TYPE 13 #define TOSHIBA_KBD_LAPTOP_TYPE 15 // // DEC - keyboards hardware/layout // #define DEC_KBD_ANSI_LAYOUT_TYPE 1 // only NT #define DEC_KBD_JIS_LAYOUT_TYPE 2 // only NT // // Korean keyboard subtype // #define MICROSOFT_KBD_101A_TYPE MICROSOFT_KBD_101_TYPE #define MICROSOFT_KBD_101B_TYPE 4 #define MICROSOFT_KBD_101C_TYPE 5 #define MICROSOFT_KBD_103_TYPE 6 // // Keyboard layout information - KBDNLSTABLE.LayoutInformation // // // If this flag is on, System sends notification to keyboard // drivers (leyout/kernel mode). when IME (Input-Mehod-Editor) // status become changed. // #define NLSKBD_INFO_SEND_IME_NOTIFICATION 0x0001 // // If this flag is on, System will use VK_HOME/VK_KANA instead of // VK_NUMLOCK/VK_SCROLL for Accessibility toggle keys. // + Typically, NEC PC-9800 Series will use this bit, because // they does not have 'NumLock' and 'ScrollLock' keys. // #define NLSKBD_INFO_ACCESSIBILITY_KEYMAP 0x0002 // // If this flag is on, System will return 101 or 106 Japanese // keyboard type/subtype id, when GetKeyboardType() is called. // #define NLSKBD_INFO_EMURATE_101_KEYBOARD 0x0010 #define NLSKBD_INFO_EMURATE_106_KEYBOARD 0x0020 // // Keyboard layout function types // // - VK_F.NLSFEProcType // #define KBDNLS_TYPE_NULL 0 #define KBDNLS_TYPE_NORMAL 1 #define KBDNLS_TYPE_TOGGLE 2 // // - VK_F.NLSFEProcCurrent // #define KBDNLS_INDEX_NORMAL 1 #define KBDNLS_INDEX_ALT 2 // // - VK_F.NLSFEProc[] // #define KBDNLS_NULL 0 // Invalid function #define KBDNLS_NOEVENT 1 // Drop keyevent #define KBDNLS_SEND_BASE_VK 2 // Send Base VK_xxx #define KBDNLS_SEND_PARAM_VK 3 // Send Parameter VK_xxx #define KBDNLS_KANALOCK 4 // VK_KANA (with hardware lock) #define KBDNLS_ALPHANUM 5 // VK_DBE_ALPHANUMERIC #define KBDNLS_HIRAGANA 6 // VK_DBE_HIRAGANA #define KBDNLS_KATAKANA 7 // VK_DBE_KATAKANA #define KBDNLS_SBCSDBCS 8 // VK_DBE_SBCSCHAR/VK_DBE_DBCSCHAR #define KBDNLS_ROMAN 9 // VK_DBE_ROMAN/VK_DBE_NOROMAN #define KBDNLS_CODEINPUT 10 // VK_DBE_CODEINPUT/VK_DBE_NOCODEINPUT #define KBDNLS_HELP_OR_END 11 // VK_HELP or VK_END [NEC PC-9800 Only] #define KBDNLS_HOME_OR_CLEAR 12 // VK_HOME or VK_CLEAR [NEC PC-9800 Only] #define KBDNLS_NUMPAD 13 // VK_NUMPAD? for Numpad key [NEC PC-9800 Only] #define KBDNLS_KANAEVENT 14 // VK_KANA [Fujitsu FMV oyayubi Only] #define KBDNLS_CONV_OR_NONCONV 15 // VK_CONVERT and VK_NONCONVERT [Fujitsu FMV oyayubi Only] #define JAPANESE_KEYBOARD(Id) ((Id).Type == KEYBOARD_TYPE_JAPAN) #define KOREAN_KEYBOARD(Id) ((Id).Type == KEYBOARD_TYPE_KOREA) // Fujitsu Oyayubi-shift keyboard #define FUJITSU_KBD_CONSOLE(Id) (JAPANESE_KEYBOARD(Id) && \ (Id).Subtype == ((NLSKBD_OEM_FUJITSU<<4)|FMV_KBD_OASYS_TYPE)) // This number 0x00020002 is registered in registry key as // HKLM\System\CurrentControlSet\Control\Terminal Server\KeyboardType Mapping\JPN #define FUJITSU_KBD_REMOTE(Id) (JAPANESE_KEYBOARD(Id) && \ (Id).SubType == 0x00020002) #define KBD_LAYOUT_LANG(hkl) (PRIMARYLANGID(HandleToUlong(hkl))) #define JAPANESE_KBD_LAYOUT(hkl) (KBD_LAYOUT_LANG(hkl) == LANG_JAPANESE) #define KOREAN_KBD_LAYOUT(hkl) (KBD_LAYOUT_LANG(hkl) == LANG_KOREAN) // end of FE specific /***************************************************************************\ * Macros for ausVK[] values (used below) * * These macros prefix each argument with VK_ to produce the name of a Virtual * Key defined in "winuser.h" (eg: ESCAPE becomes VK_ESCAPE). \***************************************************************************/ #ifndef KBD_TYPE #define KBD_TYPE 4 #endif /* * _NE() selects the Virtual Key according to keyboard type */ #if (KBD_TYPE == 1) #define _NE(v1,v2,v3,v4,v5,v6) (VK_##v1) #elif (KBD_TYPE == 2) #define _NE(v1,v2,v3,v4,v5,v6) (VK_##v2) #elif (KBD_TYPE == 3) #define _NE(v1,v2,v3,v4,v5,v6) (VK_##v3) #elif (KBD_TYPE == 4) #define _NE(v1,v2,v3,v4,v5,v6) (VK_##v4) #elif (KBD_TYPE == 5) #define _NE(v1,v2,v3,v4,v5,v6) (VK_##v5) #elif (KBD_TYPE == 6) #define _NE(v1,v2,v3,v4,v5,v6) (VK_##v6) #elif (KBD_TYPE == 7) #define _NE(v7,v8,v16,v10,v11,v12,v13) (VK_##v7) #elif (KBD_TYPE == 8) #define _NE(v7,v8,v16,v10,v11,v12,v13) (VK_##v8) #elif (KBD_TYPE == 10) #define _NE(v7,v8,v16,v10,v11,v12,v13) (VK_##v10) #elif (KBD_TYPE == 11) #define _NE(v7,v8,v16,v10,v11,v12,v13) (VK_##v11) #elif (KBD_TYPE == 12) #define _NE(v7,v8,v16,v10,v11,v12,v13) (VK_##v12) #elif (KBD_TYPE == 13) #define _NE(v7,v8,v16,v10,v11,v12,v13) (VK_##v13) #elif (KBD_TYPE == 16) #define _NE(v7,v8,v16,v10,v11,v12,v13) (VK_##v16) #elif (KBD_TYPE == 20) #define _NE(v20,v21,v22) (VK_##v20) #elif (KBD_TYPE == 21) #define _NE(v20,v21,v22) (VK_##v21) #elif (KBD_TYPE == 22) #define _NE(v20,v21,v22) (VK_##v22) #elif (KBD_TYPE == 30) #define _NE(v30,v33,v34) (VK_##v30) #elif (KBD_TYPE == 33) #define _NE(v30,v33,v34) (VK_##v33) #elif (KBD_TYPE == 34) #define _NE(v30,v33,v34) (VK_##v34) #elif (KBD_TYPE == 40) #define _NE(v40,v41) (VK_##v40) #elif (KBD_TYPE == 41) #define _NE(v40,v41) (VK_##v41) #endif /* * _EQ() selects the same Virtual Key for all keyboard types */ #if (KBD_TYPE <= 6) #define _EQ( v4 ) (VK_##v4) #elif (KBD_TYPE >= 7) && (KBD_TYPE <= 16) #define _EQ( v8 ) (VK_##v8) #elif (KBD_TYPE > 20) && (KBD_TYPE <= 22) #define _EQ(v20 ) (VK_##v20) #elif (KBD_TYPE >= 30) && (KBD_TYPE <= 34) #define _EQ( v30 ) (VK_##v30) #elif (KBD_TYPE == 37) #define _EQ( v37 ) (VK_##v37) #elif (KBD_TYPE >= 40) && (KBD_TYPE <= 41) #define _EQ( v40 ) (VK_##v40) #endif /* * A bit of trickery for virtual key names 'A' to 'Z' and '0' to '9' so * that they are not converted to a VK_* name. * With this macro, VK_'A' equates to 'A' etc. */ #define VK_ #define VK__none_ 0xFF #define VK_ABNT_C1 0xC1 #define VK_ABNT_C2 0xC2 #if (KBD_TYPE <= 6) /***************************************************************************\ * T** - Values for ausVK[] (Virtual Scan Code to Virtual Key conversion) * * These values are for Scancode Set 3 and the USA. * Other languages substitute their own values where required (files kbd**.h) * * Six sets of keyboards are supported, according to KBD_TYPE: * * KBD_TYPE Keyboard (examples) * ======== ======================================================= * 1 AT&T '301' & '302'; Olivetti 83-key; PC-XT 84-key; etc. * 2 Olivetti M24 102-key * 3 HP Vectra (DIN); Olivetti 86-key; etc. * 4 * Enhanced 101/102-key; Olivetti A; etc. * 5 Nokia (Ericsson) type 5 (1050, etc.) * 6 Nokia (Ericsson) type 6 (9140) * * * If KBD_TYPE is not defined, the default is type 4. * * KB3270 comments refers to KB 3270 keyboards in native emulation mode (DIP * switches all OFF), and the Scancode Map used to convert its scancodes to * standard scancode set 1. * KB3270 <= 57 - this entry is reached by mapping from scancode 0x57 * to an arbitrary scancode: the VK is what counts * KB3270 => HOME - this scancode is mapped to the scancode for VK_HOME * KB3270 - no mapping involved, a scancode for KB3270 only * * _EQ() : all keyboard types have the same virtual key for this scancode * _NE() : different virtual keys for this scancode, depending on kbd type * * +------+ +--------+--------+--------+--------+--------+--------+ * | Scan | | kbd | kbd | kbd | kbd | kbd | kbd | * | code | | type 1 | type 2 | type 3 | type 4 | type 5 | type 6 | \****+-------+-+--------+--------+--------+--------+--------+--------+******/ #define T00 _EQ( _none_ ) #define T01 _EQ( ESCAPE ) #define T02 _EQ( '1' ) #define T03 _EQ( '2' ) #define T04 _EQ( '3' ) #define T05 _EQ( '4' ) #define T06 _EQ( '5' ) #define T07 _EQ( '6' ) #define T08 _EQ( '7' ) #define T09 _EQ( '8' ) #define T0A _EQ( '9' ) #define T0B _EQ( '0' ) #define T0C _EQ( OEM_MINUS ) #define T0D _NE(OEM_PLUS,OEM_4, OEM_PLUS,OEM_PLUS,OEM_PLUS,OEM_PLUS) #define T0E _EQ( BACK ) #define T0F _EQ( TAB ) #define T10 _EQ( 'Q' ) #define T11 _EQ( 'W' ) #define T12 _EQ( 'E' ) #define T13 _EQ( 'R' ) #define T14 _EQ( 'T' ) #define T15 _EQ( 'Y' ) #define T16 _EQ( 'U' ) #define T17 _EQ( 'I' ) #define T18 _EQ( 'O' ) #define T19 _EQ( 'P' ) #define T1A _NE(OEM_4, OEM_6, OEM_4, OEM_4, OEM_4, OEM_4 ) #define T1B _NE(OEM_6, OEM_1, OEM_6, OEM_6, OEM_6, OEM_6 ) #define T1C _EQ( RETURN ) #define T1D _EQ( LCONTROL ) #define T1E _EQ( 'A' ) #define T1F _EQ( 'S' ) #define T20 _EQ( 'D' ) #define T21 _EQ( 'F' ) #define T22 _EQ( 'G' ) #define T23 _EQ( 'H' ) #define T24 _EQ( 'J' ) #define T25 _EQ( 'K' ) #define T26 _EQ( 'L' ) #define T27 _NE(OEM_1, OEM_PLUS,OEM_1, OEM_1, OEM_1, OEM_1 ) #define T28 _NE(OEM_7, OEM_3, OEM_7, OEM_7, OEM_3, OEM_3 ) #define T29 _NE(OEM_3, OEM_7, OEM_3, OEM_3, OEM_7, OEM_7 ) #define T2A _EQ( LSHIFT ) #define T2B _EQ( OEM_5 ) #define T2C _EQ( 'Z' ) #define T2D _EQ( 'X' ) #define T2E _EQ( 'C' ) #define T2F _EQ( 'V' ) #define T30 _EQ( 'B' ) #define T31 _EQ( 'N' ) #define T32 _EQ( 'M' ) #define T33 _EQ( OEM_COMMA ) #define T34 _EQ( OEM_PERIOD ) #define T35 _EQ( OEM_2 ) #define T36 _EQ( RSHIFT ) #define T37 _EQ( MULTIPLY ) #define T38 _EQ( LMENU ) #define T39 _EQ( ' ' ) #define T3A _EQ( CAPITAL ) #define T3B _EQ( F1 ) #define T3C _EQ( F2 ) #define T3D _EQ( F3 ) #define T3E _EQ( F4 ) #define T3F _EQ( F5 ) #define T40 _EQ( F6 ) #define T41 _EQ( F7 ) #define T42 _EQ( F8 ) #define T43 _EQ( F9 ) #define T44 _EQ( F10 ) #define T45 _EQ( NUMLOCK ) #define T46 _EQ( SCROLL ) #define T47 _EQ( HOME ) #define T48 _EQ( UP ) #define T49 _EQ( PRIOR ) #define T4A _EQ( SUBTRACT ) #define T4B _EQ( LEFT ) #define T4C _EQ( CLEAR ) #define T4D _EQ( RIGHT ) #define T4E _EQ( ADD ) #define T4F _EQ( END ) #define T50 _EQ( DOWN ) #define T51 _EQ( NEXT ) #define T52 _EQ( INSERT ) #define T53 _EQ( DELETE ) #define T54 _EQ( SNAPSHOT ) #define T55 _EQ( _none_ ) // KB3270 => DOWN #define T56 _NE(OEM_102, HELP, OEM_102, OEM_102, _none_, OEM_PA2 ) // KB3270 => LEFT #define T57 _NE(F11, RETURN, F11, F11, _none_, HELP ) // KB3270 => ZOOM #define T58 _NE(F12, LEFT, F12, F12, _none_, OEM_102 ) // KB3270 => HELP #define T59 _EQ( CLEAR ) #define T5A _EQ( OEM_WSCTRL )// WSCtrl #define T5B _EQ( OEM_FINISH )// Finish #define T5C _EQ( OEM_JUMP )// Jump #define T5D _EQ( EREOF ) #define T5E _EQ( OEM_BACKTAB ) // KB3270 <= 7E #define T5F _EQ( OEM_AUTO ) // KB3270 #define T60 _EQ( _none_ ) #define T61 _EQ( _none_ ) #define T62 _EQ( ZOOM ) // KB3270 <= 57 #define T63 _EQ( HELP ) // KB3270 <= 58 #define T64 _EQ( F13 ) #define T65 _EQ( F14 ) #define T66 _EQ( F15 ) #define T67 _EQ( F16 ) #define T68 _EQ( F17 ) #define T69 _EQ( F18 ) #define T6A _EQ( F19 ) #define T6B _EQ( F20 ) #define T6C _EQ( F21 ) #define T6D _EQ( F22 ) #define T6E _EQ( F23 ) #define T6F _EQ( OEM_PA3 ) // KB3270 #define T70 _EQ( _none_ ) #define T71 _EQ( OEM_RESET ) // KB3270 #define T72 _EQ( _none_ ) #define T73 _EQ( ABNT_C1 ) #define T74 _EQ( _none_ ) #define T75 _EQ( _none_ ) // KB3270 => RETURN #define T76 _EQ( F24 ) #define T77 _EQ( _none_ ) // KB3270 => HOME #define T78 _EQ( _none_ ) // KB3270 => UP #define T79 _EQ( _none_ ) // KB3270 => DELETE #define T7A _EQ( _none_ ) // KB3270 => INSERT #define T7B _EQ( OEM_PA1 ) // KB3270 #define T7C _EQ( TAB ) // KB3270 => TAB #define T7D _EQ( _none_ ) // KB3270 => RIGHT #define T7E _EQ( ABNT_C2 ) // KB3270 => BACKTAB #define T7F _EQ( OEM_PA2 ) // KB3270 #define X10 _EQ( MEDIA_PREV_TRACK ) // SpeedRacer #define X19 _EQ( MEDIA_NEXT_TRACK ) // SpeedRacer #define X1C _EQ( RETURN ) #define X1D _EQ( RCONTROL ) #define X20 _EQ( VOLUME_MUTE ) // SpeedRacer #define X21 _EQ( LAUNCH_APP2 ) // SpeedRacer (Calculator?) #define X22 _EQ( MEDIA_PLAY_PAUSE ) // SpeedRacer #define X24 _EQ( MEDIA_STOP ) // SpeedRacer #define X2E _EQ( VOLUME_DOWN ) // SpeedRacer #define X30 _EQ( VOLUME_UP ) // SpeedRacer #define X32 _EQ( BROWSER_HOME ) // SpeedRacer #define X35 _EQ( DIVIDE ) #define X37 _EQ( SNAPSHOT ) #define X38 _EQ( RMENU ) #define X46 _EQ( CANCEL ) #define X47 _EQ( HOME ) #define X48 _EQ( UP ) #define X49 _EQ( PRIOR ) #define X4B _EQ( LEFT ) #define X4D _EQ( RIGHT ) #define X4F _EQ( END ) #define X50 _EQ( DOWN ) #define X51 _NE(NEXT, F1, NEXT, NEXT, _none_, OEM_PA2 ) #define X52 _EQ( INSERT ) #define X53 _EQ( DELETE ) #define X5B _EQ( LWIN ) #define X5C _EQ( RWIN ) #define X5D _EQ( APPS ) #define X5E _EQ( POWER ) #define X5F _EQ( SLEEP ) // SpeedRacer #define X65 _EQ( BROWSER_SEARCH ) // SpeedRacer #define X66 _EQ( BROWSER_FAVORITES ) // SpeedRacer #define X67 _EQ( BROWSER_REFRESH ) // SpeedRacer #define X68 _EQ( BROWSER_STOP ) // SpeedRacer #define X69 _EQ( BROWSER_FORWARD ) // SpeedRacer #define X6A _EQ( BROWSER_BACK ) // SpeedRacer #define X6B _EQ( LAUNCH_APP1 ) // SpeedRacer (my computer?) #define X6C _EQ( LAUNCH_MAIL ) // SpeedRacer #define X6D _EQ( LAUNCH_MEDIA_SELECT ) // SpeedRacer /* * The break key is sent to us as E1,LCtrl,NumLock * We must convert the E1+LCtrl to BREAK, then ignore the Numlock */ #define Y1D _EQ( PAUSE ) #elif (KBD_TYPE >= 7) && (KBD_TYPE <= 16) /***********************************************************************************\ * T** - Values for ausVK[] (Virtual Scan Code to Virtual Key conversion) * * Three sets of keyboards are supported, according to KBD_TYPE: * * KBD_TYPE Keyboard (examples) * ======== ===================================== * 7 Japanese IBM type 002 keyboard. * 8 * Japanese OADG (106) keyboard. * 10 Korean 101 (type A) keyboard. * 11 Korean 101 (type B) keyboard. * 12 Korean 101 (type C) keyboard. * 13 Korean 103 keyboard. * 16 Japanese AX keyboard. * * +------+ +----------+----------+----------+----------+----------+----------+----------+ * | Scan | | kbd | kbd | kbd | kbd | kbd | kbd | kbd | * | code | | type 7 | type 8 | type 16 | type 10 | type 11 | type 12 | type 13 | \****+-------+-+----------+----------+----------+----------+----------+----------+----------+*/ #define T00 _EQ( _none_ ) #define T01 _EQ( ESCAPE ) #define T02 _EQ( '1' ) #define T03 _EQ( '2' ) #define T04 _EQ( '3' ) #define T05 _EQ( '4' ) #define T06 _EQ( '5' ) #define T07 _EQ( '6' ) #define T08 _EQ( '7' ) #define T09 _EQ( '8' ) #define T0A _EQ( '9' ) #define T0B _EQ( '0' ) #define T0C _EQ( OEM_MINUS ) #define T0D _NE(OEM_7, OEM_7, OEM_PLUS, OEM_PLUS, OEM_PLUS, OEM_PLUS, OEM_PLUS ) #define T0E _EQ( BACK ) #define T0F _EQ( TAB ) #define T10 _EQ( 'Q' ) #define T11 _EQ( 'W' ) #define T12 _EQ( 'E' ) #define T13 _EQ( 'R' ) #define T14 _EQ( 'T' ) #define T15 _EQ( 'Y' ) #define T16 _EQ( 'U' ) #define T17 _EQ( 'I' ) #define T18 _EQ( 'O' ) #define T19 _EQ( 'P' ) #define T1A _NE(OEM_4, OEM_3, OEM_4, OEM_4, OEM_4, OEM_4, OEM_4 ) #define T1B _NE(OEM_6, OEM_4, OEM_6, OEM_6, OEM_6, OEM_6, OEM_6 ) #define T1C _EQ( RETURN ) #define T1D _EQ( LCONTROL ) #define T1E _EQ( 'A' ) #define T1F _EQ( 'S' ) #define T20 _EQ( 'D' ) #define T21 _EQ( 'F' ) #define T22 _EQ( 'G' ) #define T23 _EQ( 'H' ) #define T24 _EQ( 'J' ) #define T25 _EQ( 'K' ) #define T26 _EQ( 'L' ) #define T27 _NE(OEM_PLUS, OEM_PLUS, OEM_1, OEM_1, OEM_1, OEM_1, OEM_1 ) #define T28 _NE(OEM_1, OEM_1, OEM_7, OEM_7, OEM_7, OEM_7, OEM_7 ) #define T29 _NE(OEM_3, DBE_SBCSCHAR,OEM_3, OEM_3, OEM_3, OEM_3, OEM_3 ) #define T2A _EQ( LSHIFT ) #define T2B _NE(OEM_5, OEM_6, OEM_5, OEM_5, OEM_5, OEM_5, OEM_5 ) #define T2C _EQ( 'Z' ) #define T2D _EQ( 'X' ) #define T2E _EQ( 'C' ) #define T2F _EQ( 'V' ) #define T30 _EQ( 'B' ) #define T31 _EQ( 'N' ) #define T32 _EQ( 'M' ) #define T33 _EQ( OEM_COMMA ) #define T34 _EQ( OEM_PERIOD ) #define T35 _EQ( OEM_2 ) #define T36 _EQ( RSHIFT ) #define T37 _EQ( MULTIPLY ) #define T38 _EQ( LMENU ) #define T39 _EQ( ' ' ) #define T3A _NE(DBE_ALPHANUMERIC,DBE_ALPHANUMERIC,CAPITAL,CAPITAL,CAPITAL,CAPITAL,CAPITAL ) #define T3B _EQ( F1 ) #define T3C _EQ( F2 ) #define T3D _EQ( F3 ) #define T3E _EQ( F4 ) #define T3F _EQ( F5 ) #define T40 _EQ( F6 ) #define T41 _EQ( F7 ) #define T42 _EQ( F8 ) #define T43 _EQ( F9 ) #define T44 _EQ( F10 ) #define T45 _EQ( NUMLOCK ) #define T46 _EQ( SCROLL ) #define T47 _EQ( HOME ) #define T48 _EQ( UP ) #define T49 _EQ( PRIOR ) #define T4A _EQ( SUBTRACT ) #define T4B _EQ( LEFT ) #define T4C _EQ( CLEAR ) #define T4D _EQ( RIGHT ) #define T4E _EQ( ADD ) #define T4F _EQ( END ) #define T50 _EQ( DOWN ) #define T51 _EQ( NEXT ) #define T52 _EQ( INSERT ) #define T53 _EQ( DELETE ) #define T54 _EQ( SNAPSHOT ) #define T55 _EQ( _none_ ) #define T56 _NE(_none_, _none_, OEM_102, OEM_102, OEM_102, OEM_102, OEM_102 ) #define T57 _EQ( F11 ) #define T58 _EQ( F12 ) #define T59 _EQ( CLEAR ) #define T5A _NE(NONAME, NONAME, NONCONVERT,OEM_WSCTRL,OEM_WSCTRL,OEM_WSCTRL,OEM_WSCTRL) #define T5B _NE(NONAME, NONAME, CONVERT, OEM_FINISH,OEM_FINISH,OEM_FINISH,OEM_FINISH) #define T5C _NE(NONAME, NONAME, OEM_AX, OEM_JUMP, OEM_JUMP, OEM_JUMP, OEM_JUMP ) #define T5D _EQ( EREOF ) #define T5E _NE(_none_, _none_, _none_, OEM_BACKTAB,OEM_BACKTAB,OEM_BACKTAB,OEM_BACKTAB) #define T5F _NE(NONAME, NONAME, NONAME, OEM_AUTO, OEM_AUTO, OEM_AUTO, OEM_AUTO ) #define T60 _EQ( _none_ ) #define T61 _NE(_none_, _none_, _none_, ZOOM, ZOOM, ZOOM, ZOOM ) #define T62 _NE(_none_, _none_, _none_, HELP, HELP, HELP, HELP ) #define T63 _EQ( _none_ ) #define T64 _EQ( F13 ) #define T65 _EQ( F14 ) #define T66 _EQ( F15 ) #define T67 _EQ( F16 ) #define T68 _EQ( F17 ) #define T69 _EQ( F18 ) #define T6A _EQ( F19 ) #define T6B _EQ( F20 ) #define T6C _EQ( F21 ) #define T6D _EQ( F22 ) #define T6E _EQ( F23 ) #define T6F _NE(_none_, _none_, _none_, OEM_PA3, OEM_PA3, OEM_PA3, OEM_PA3 ) #define T70 _NE(DBE_KATAKANA,DBE_HIRAGANA,_none_,_none_, _none_, _none_, _none_ ) #define T71 _NE(_none_, _none_, _none_, OEM_RESET, OEM_RESET, OEM_RESET, OEM_RESET ) #define T72 _EQ( _none_ ) #define T73 _NE(OEM_102, OEM_102, _none_, ABNT_C1, ABNT_C1, ABNT_C1, ABNT_C1 ) #define T74 _EQ( _none_ ) #define T75 _EQ( _none_ ) #define T76 _EQ( F24 ) #define T77 _NE(DBE_SBCSCHAR,_none_, _none_, _none_, _none_, _none_, _none_ ) #define T78 _EQ( _none_ ) #define T79 _NE(CONVERT, CONVERT, _none_, _none_, _none_, _none_, _none_ ) #define T7A _EQ( _none_ ) #define T7B _NE(NONCONVERT,NONCONVERT,_none_, OEM_PA1, OEM_PA1, OEM_PA1, OEM_PA1 ) #define T7C _EQ( TAB ) #define T7D _NE(_none_, OEM_5, _none_, _none_, _none_, _none_, _none_ ) #define T7E _EQ( ABNT_C2 ) #define T7F _EQ( OEM_PA2 ) #define X10 _EQ( MEDIA_PREV_TRACK ) // SpeedRacer #define X19 _EQ( MEDIA_NEXT_TRACK ) // SpeedRacer #define X1C _EQ( RETURN ) #define X1D _NE(RCONTROL, RCONTROL,DBE_KATAKANA,HANJA, HANGEUL, RCONTROL, RCONTROL ) #define X20 _EQ( VOLUME_MUTE ) // SpeedRacer #define X21 _EQ( LAUNCH_APP2 ) // SpeedRacer #define X22 _EQ( MEDIA_PLAY_PAUSE ) // SpeedRacer #define X24 _EQ( MEDIA_STOP ) // SpeedRacer #define X2E _EQ( VOLUME_DOWN ) // SpeedRacer #define X30 _EQ( VOLUME_UP ) // SpeedRacer #define X32 _EQ( BROWSER_HOME ) // SpeedRacer #define X33 _NE(OEM_8, _none_, _none_, _none_, _none_, _none_, _none_ ) #define X35 _EQ( DIVIDE ) #define X37 _EQ( SNAPSHOT ) #define X38 _NE(DBE_HIRAGANA,RMENU, KANJI, HANGEUL, HANJA, RMENU, RMENU ) #define X42 _EQ( _none_ ) #define X43 _EQ( _none_ ) #define X44 _EQ( _none_ ) #define X46 _EQ( CANCEL ) #define X47 _EQ( HOME ) #define X48 _EQ( UP ) #define X49 _EQ( PRIOR ) #define X4B _EQ( LEFT ) #define X4D _EQ( RIGHT ) #define X4F _EQ( END ) #define X50 _EQ( DOWN ) #define X51 _EQ( NEXT ) #define X52 _EQ( INSERT ) #define X53 _EQ( DELETE ) #define X5B _EQ( LWIN ) #define X5C _EQ( RWIN ) #define X5D _EQ( APPS ) #define X5E _EQ( POWER ) #define X5F _EQ( SLEEP ) #define X65 _EQ( BROWSER_SEARCH ) // SpeedRacer #define X66 _EQ( BROWSER_FAVORITES ) // SpeedRacer #define X67 _EQ( BROWSER_REFRESH ) // SpeedRacer #define X68 _EQ( BROWSER_STOP ) // SpeedRacer #define X69 _EQ( BROWSER_FORWARD ) // SpeedRacer #define X6A _EQ( BROWSER_BACK ) // SpeedRacer #define X6B _EQ( LAUNCH_APP1 ) // SpeedRacer #define X6C _EQ( LAUNCH_MAIL ) // SpeedRacer #define X6D _EQ( LAUNCH_MEDIA_SELECT ) // SpeedRacer #define XF1 _NE(_none_, _none_, _none_, HANJA, HANJA, HANJA, HANJA ) #define XF2 _NE(_none_, _none_, _none_, HANGEUL, HANGEUL, HANGEUL, HANGEUL ) /* * The break key is sent to us as E1,LCtrl,NumLock * We must convert the E1+LCtrl to BREAK, then ignore the Numlock */ #define Y1D _EQ( PAUSE ) #elif (KBD_TYPE > 20) && (KBD_TYPE <= 22) /***********************************************************************\ * T** - Values for ausVK[] (Virtual Scan Code to Virtual Key conversion) * * Three sets of keyboards are supported, according to KBD_TYPE: * * KBD_TYPE Keyboard (examples) * ======== ===================================== * 20 Fujitsu FMR JIS keyboard. * 21 Fujitsu FMR OYAYUBI keyboard. * 22 * Fujitsu FMV OYAYUBI keyboard. * * +------+ +----------+----------+----------+ * | Scan | | kbd | kbd | kbd | * | code | | type 20 | type 21 | type 22 | \****+-------+-+----------+----------+----------+***********************/ #define T00 _EQ( _none_ ) #define T01 _EQ( ESCAPE ) #define T02 _EQ( '1' ) #define T03 _EQ( '2' ) #define T04 _EQ( '3' ) #define T05 _EQ( '4' ) #define T06 _EQ( '5' ) #define T07 _EQ( '6' ) #define T08 _EQ( '7' ) #define T09 _EQ( '8' ) #define T0A _EQ( '9' ) #define T0B _EQ( '0' ) #define T0C _EQ( OEM_MINUS ) #define T0D _EQ( OEM_7 ) #define T0E _NE(OEM_5, OEM_5, BACK ) #define T0F _NE(BACK, BACK, TAB ) #define T10 _NE(TAB, TAB, 'Q' ) #define T11 _NE('Q', 'Q', 'W' ) #define T12 _NE('W', 'W', 'E' ) #define T13 _NE('E', 'E', 'R' ) #define T14 _NE('R', 'R', 'T' ) #define T15 _NE('T', 'T', 'Y' ) #define T16 _NE('Y', 'Y', 'U' ) #define T17 _NE('U', 'U', 'I' ) #define T18 _NE('I', 'I', 'O' ) #define T19 _NE('O', 'O', 'P' ) #define T1A _NE('P', 'P', OEM_3 ) #define T1B _NE(OEM_3, OEM_3, OEM_4 ) #define T1C _NE(OEM_4, OEM_4, RETURN ) #define T1D _NE(RETURN, RETURN, LCONTROL ) #define T1E _EQ( 'A' ) #define T1F _EQ( 'S' ) #define T20 _EQ( 'D' ) #define T21 _EQ( 'F' ) #define T22 _EQ( 'G' ) #define T23 _EQ( 'H' ) #define T24 _EQ( 'J' ) #define T25 _EQ( 'K' ) #define T26 _EQ( 'L' ) #define T27 _EQ( OEM_PLUS ) #define T28 _EQ( OEM_1 ) #define T29 _NE(OEM_6, OEM_6, DBE_SBCSCHAR) #define T2A _NE('Z', 'Z', LSHIFT ) #define T2B _NE('X', 'X', OEM_6 ) #define T2C _NE('C', 'C', 'Z' ) #define T2D _NE('V', 'V', 'X' ) #define T2E _NE('B', 'B', 'C' ) #define T2F _NE('N', 'N', 'V' ) #define T30 _NE('M', 'M', 'B' ) #define T31 _NE(OEM_COMMA, OEM_COMMA, 'N' ) #define T32 _NE(OEM_PERIOD,OEM_PERIOD,'M' ) #define T33 _NE(OEM_2, OEM_2, OEM_COMMA ) #define T34 _NE(OEM_8, OEM_8, OEM_PERIOD) #define T35 _NE(' ', ' ', OEM_2 ) #define T36 _NE(MULTIPLY, MULTIPLY, RSHIFT ) #define T37 _NE(DIVIDE, DIVIDE, MULTIPLY ) #define T38 _NE(ADD, ADD, LMENU ) #define T39 _NE(SUBTRACT, SUBTRACT, ' ' ) #define T3A _NE(NUMPAD7, NUMPAD7, DBE_ALPHANUMERIC) #define T3B _NE(NUMPAD8, NUMPAD8, F1 ) #define T3C _NE(NUMPAD9, NUMPAD9, F2 ) #define T3D _NE(EQUAL, EQUAL, F3 ) #define T3E _NE(NUMPAD4, NUMPAD4, F4 ) #define T3F _NE(NUMPAD5, NUMPAD5, F5 ) #define T40 _NE(NUMPAD6, NUMPAD6, F6 ) #define T41 _NE(SEPARATOR, SEPARATOR, F7 ) #define T42 _NE(NUMPAD1, NUMPAD1, F8 ) #define T43 _NE(NUMPAD2, NUMPAD2, F9 ) #define T44 _NE(NUMPAD3, NUMPAD3, F10 ) #define T45 _NE(RETURN, RETURN, NUMLOCK ) #define T46 _NE(NUMPAD0, NUMPAD0, SCROLL ) #define T47 _NE(DECIMAL, DECIMAL, HOME ) #define T48 _NE(INSERT, INSERT, UP ) #define T49 _NE(OEM_00, OEM_00, PRIOR ) #define T4A _NE(OEM_000, OEM_000, SUBTRACT ) #define T4B _NE(DELETE, DELETE, LEFT ) #define T4C _NE(_none_, _none_, CLEAR ) #define T4D _NE(UP, UP, RIGHT ) #define T4E _NE(HOME, HOME, ADD ) #define T4F _NE(LEFT, LEFT, END ) #define T50 _EQ( DOWN ) #define T51 _NE(RIGHT, RIGHT, NEXT ) #define T52 _NE(LCONTROL, LCONTROL, INSERT ) #define T53 _NE(LSHIFT, LSHIFT, DELETE ) #define T54 _NE(_none_, _none_, SNAPSHOT ) #define T55 _NE(CAPITAL, _none_, _none_ ) #define T56 _NE(DBE_HIRAGANA,_none_, _none_ ) #define T57 _NE(NONCONVERT,NONCONVERT,F11 ) #define T58 _NE(CONVERT, CONVERT, F12 ) #define T59 _NE(KANJI, KANJI, CLEAR ) #define T5A _NE(DBE_KATAKANA,_none_, NONAME ) #define T5B _NE(F12, F12, NONAME ) #define T5C _NE(LMENU, LMENU, NONAME ) #define T5D _NE(F1, F1, EREOF ) #define T5E _NE(F2, F2, _none_ ) #define T5F _NE(F3, F3, NONAME ) #define T60 _NE(F4, F4, _none_ ) #define T61 _NE(F5, F5, _none_ ) #define T62 _NE(F6, F6, _none_ ) #define T63 _NE(F7, F7, _none_ ) #define T64 _NE(F8, F8, F13 ) #define T65 _NE(F9, F9, F14 ) #define T66 _NE(F10, F10, F15 ) #define T67 _NE(_none_, OEM_LOYA, F16 ) #define T68 _NE(_none_, OEM_ROYA, F17 ) #define T69 _NE(F11, F11, F18 ) #define T6A _NE(_none_, DBE_ALPHANUMERIC,F19 ) #define T6B _NE(OEM_JISHO, OEM_JISHO, F20 ) #define T6C _NE(OEM_MASSHOU,OEM_MASSHOU,F21 ) #define T6D _NE(_none_, _none_, F22 ) #define T6E _NE(PRIOR, PRIOR, F23 ) #define T6F _NE(_none_, DBE_KATAKANA,_none_ ) #define T70 _NE(NEXT, NEXT, DBE_HIRAGANA) #define T71 _EQ( _none_ ) #define T72 _NE(CANCEL, CANCEL, _none_ ) #define T73 _NE(EXECUTE, EXECUTE, OEM_102 ) #define T74 _NE(F13, F13, _none_ ) #define T75 _NE(F14, F14, _none_ ) #define T76 _NE(F15, F15, F24 ) #define T77 _NE(F16, F16, _none_ ) #define T78 _NE(CLEAR, CLEAR, _none_ ) #define T79 _NE(HELP, HELP, CONVERT ) #define T7A _NE(END, END, _none_ ) #define T7B _NE(SCROLL, SCROLL, NONCONVERT) #define T7C _NE(PAUSE, PAUSE, TAB ) #define T7D _NE(SNAPSHOT, SNAPSHOT, OEM_5 ) #define T7E _NE(_none_, _none_, ABNT_C2 ) #define T7F _NE(_none_, _none_, OEM_PA2 ) #define X1C _NE(_none_, _none_, RETURN ) #define X1D _NE(_none_, _none_, RCONTROL ) #define X33 _EQ( _none_ ) #define X35 _NE(_none_, _none_, DIVIDE ) #define X37 _NE(_none_, _none_, SNAPSHOT ) #define X38 _NE(_none_, _none_, RMENU ) #define X42 _EQ( _none_ ) #define X43 _EQ( _none_ ) #define X44 _EQ( _none_ ) #define X46 _NE(_none_, _none_, CANCEL ) #define X47 _NE(_none_, _none_, HOME ) #define X48 _NE(_none_, _none_, UP ) #define X49 _NE(_none_, _none_, PRIOR ) #define X4B _NE(_none_, _none_, LEFT ) #define X4D _NE(_none_, _none_, RIGHT ) #define X4F _NE(_none_, _none_, END ) #define X50 _NE(_none_, _none_, DOWN ) #define X51 _NE(_none_, _none_, NEXT ) #define X52 _NE(_none_, _none_, INSERT ) #define X53 _NE(_none_, _none_, DELETE ) #define X5B _NE(_none_, _none_, LWIN ) #define X5C _NE(_none_, _none_, RWIN ) #define X5D _NE(_none_, _none_, APPS ) #define X5E _EQ( POWER ) #define X5F _EQ( SLEEP ) #define X60 _NE(SCROLL, SCROLL, _none_ ) #define X61 _NE(HOME, HOME, _none_ ) #define X62 _NE(END, END, _none_ ) #define X63 _EQ( _none_ ) #define X64 _EQ( _none_ ) #define X65 _EQ( _none_ ) #define X66 _EQ( _none_ ) #define X6D _NE(OEM_TOUROKU,OEM_TOUROKU,_none_ ) #define X71 _NE(DBE_SBCSCHAR,DBE_SBCSCHAR,_none_) #define X74 _EQ( _none_ ) #define X75 _EQ( _none_ ) #define X76 _EQ( _none_ ) #define X77 _EQ( _none_ ) #define X78 _EQ( _none_ ) #define X79 _EQ( _none_ ) #define X7A _EQ( _none_ ) #define X7B _EQ( _none_ ) /* * The break key is sent to us as E1,LCtrl,NumLock * We must convert the E1+LCtrl to BREAK, then ignore the Numlock * which must be ignored. Alternatively, translate Ctrl-Numlock * to break, but don't let the CTRL through as a WM_KEYUP/DOWN) ? */ #define Y1D _EQ( PAUSE ) #elif (KBD_TYPE >= 30) && (KBD_TYPE <= 34) /***********************************************************************\ * T** - Values for ausVK[] (Virtual Scan Code to Virtual Key conversion) * * Three sets of keyboards are supported, according to KBD_TYPE: * * KBD_TYPE Keyboard (examples) * ======== ===================================== * 30 * NEC PC-9800 Normal Keyboard. * 31 NEC PC-9800 Document processor Keyboard. - not supported on NT5 * 32 NEC PC-9800 106 Keyboard. - same as KBD_TYPE 8 * 33 NEC PC-9800 for Hydra: PC-9800 Keyboard on Windows NT 5.0. * NEC PC-98NX for Hydra: PC-9800 Keyboard on Windows 95/NT. * 34 NEC PC-9800 for Hydra: PC-9800 Keyboard on Windows NT 3.51/4.0. * * +------+ +----------+----------+----------+ * | Scan | | kbd | kbd | kbd | * | code | | type 30 | type 33 | type 34 | \****+-------+-+----------+----------+----------+***********************/ #define T00 _EQ(_none_ ) #define T01 _EQ(ESCAPE ) #define T02 _EQ('1' ) #define T03 _EQ('2' ) #define T04 _EQ('3' ) #define T05 _EQ('4' ) #define T06 _EQ('5' ) #define T07 _EQ('6' ) #define T08 _EQ('7' ) #define T09 _EQ('8' ) #define T0A _EQ('9' ) #define T0B _EQ('0' ) #define T0C _EQ(OEM_MINUS ) #define T0D _NE(OEM_7, OEM_7, OEM_PLUS ) #define T0E _EQ(BACK ) #define T0F _EQ(TAB ) #define T10 _EQ('Q' ) #define T11 _EQ('W' ) #define T12 _EQ('E' ) #define T13 _EQ('R' ) #define T14 _EQ('T' ) #define T15 _EQ('Y' ) #define T16 _EQ('U' ) #define T17 _EQ('I' ) #define T18 _EQ('O' ) #define T19 _EQ('P' ) #define T1A _NE(OEM_3, OEM_3, OEM_4 ) #define T1B _NE(OEM_4, OEM_4, OEM_6 ) #define T1C _EQ(RETURN ) #define T1D _EQ(LCONTROL ) #define T1E _EQ('A' ) #define T1F _EQ('S' ) #define T20 _EQ('D' ) #define T21 _EQ('F' ) #define T22 _EQ('G' ) #define T23 _EQ('H' ) #define T24 _EQ('J' ) #define T25 _EQ('K' ) #define T26 _EQ('L' ) #define T27 _NE(OEM_PLUS, OEM_PLUS, OEM_1 ) #define T28 _NE(OEM_1, OEM_1, OEM_7 ) #define T29 _NE(DBE_SBCSCHAR, \ DBE_SBCSCHAR, \ OEM_3 ) #define T2A _EQ(LSHIFT ) #define T2B _NE(OEM_6, OEM_6, OEM_5 ) #define T2C _EQ('Z' ) #define T2D _EQ('X' ) #define T2E _EQ('C' ) #define T2F _EQ('V' ) #define T30 _EQ('B' ) #define T31 _EQ('N' ) #define T32 _EQ('M' ) #define T33 _EQ(OEM_COMMA ) #define T34 _EQ(OEM_PERIOD ) #define T35 _EQ(OEM_2 ) #define T36 _EQ(RSHIFT ) #define T37 _EQ(MULTIPLY ) #define T38 _EQ(LMENU ) #define T39 _EQ(' ' ) #define T3A _EQ(CAPITAL ) #define T3B _EQ(F1 ) #define T3C _EQ(F2 ) #define T3D _EQ(F3 ) #define T3E _EQ(F4 ) #define T3F _EQ(F5 ) #define T40 _EQ(F6 ) #define T41 _EQ(F7 ) #define T42 _EQ(F8 ) #define T43 _EQ(F9 ) #define T44 _EQ(F10 ) #define T45 _EQ(NUMLOCK ) #define T46 _EQ(SCROLL ) #define T47 _EQ(HOME ) #define T48 _EQ(UP ) #define T49 _EQ(PRIOR ) #define T4A _EQ(SUBTRACT ) #define T4B _EQ(LEFT ) #define T4C _EQ(CLEAR ) #define T4D _EQ(RIGHT ) #define T4E _EQ(ADD ) #define T4F _EQ(END ) #define T50 _EQ(DOWN ) #define T51 _EQ(NEXT ) #define T52 _EQ(INSERT ) #define T53 _EQ(DELETE ) #define T54 _EQ(SNAPSHOT ) #define T55 _NE(_none_, _none_, OEM_8 ) #define T56 _EQ(_none_ ) #define T57 _EQ(F11 ) #define T58 _EQ(F12 ) #define T59 _EQ(OEM_NEC_EQUAL ) #define T5A _NE(NONAME, NONAME, NONCONVERT) #define T5B _NE(_none_, _none_, NONAME ) #define T5C _EQ(SEPARATOR ) #define T5D _EQ(F13 ) #define T5E _EQ(F14 ) #define T5F _EQ(F15 ) #define T60 _EQ(_none_ ) #define T61 _EQ(_none_ ) #define T62 _EQ(_none_ ) #define T63 _EQ(_none_ ) #define T64 _NE(_none_, _none_, F13 ) #define T65 _NE(_none_, _none_, F14 ) #define T66 _NE(_none_, _none_, F15 ) #define T67 _NE(_none_, _none_, F16 ) #define T68 _NE(_none_, _none_, F17 ) #define T69 _NE(_none_, _none_, F18 ) #define T6A _NE(_none_, _none_, F19 ) #define T6B _NE(_none_, _none_, F20 ) #define T6C _NE(_none_, _none_, F21 ) #define T6D _NE(_none_, _none_, F22 ) #define T6E _NE(_none_, _none_, F23 ) #define T6F _EQ(_none_ ) #define T70 _NE(KANA, KANA, DBE_HIRAGANA) #define T71 _EQ(_none_ ) #define T72 _EQ(_none_ ) #define T73 _NE(OEM_8, OEM_8, _none_ ) #define T74 _NE(_none_, OEM_NEC_EQUAL, \ _none_ ) #define T75 _NE(_none_, SEPARATOR, _none_ ) #define T76 _NE(_none_, _none_, F24 ) #define T77 _NE(_none_, _none_, DBE_SBCSCHAR) #define T78 _EQ(_none_ ) #define T79 _EQ(CONVERT ) #define T7A _EQ(_none_ ) #define T7B _EQ(NONCONVERT ) #define T7C _NE(TAB, _none_, _none_ ) #define T7D _NE(OEM_5, OEM_5, _none_ ) #define T7E _NE(ABNT_C2, ABNT_C2, _none_ ) #define T7F _NE(OEM_PA2, OEM_PA2, _none_ ) #define X1C _EQ(RETURN ) #define X1D _NE(RCONTROL, RCONTROL, KANA ) #define X33 _EQ(_none_ ) #define X35 _EQ(DIVIDE ) #define X37 _EQ(SNAPSHOT ) #define X38 _NE(_none_, _none_, KANJI ) #define X42 _NE(_none_, _none_, RCONTROL ) #define X43 _NE(_none_, _none_, RMENU ) #define X44 _EQ(_none_ ) #define X46 _EQ(CANCEL ) #define X47 _EQ(HOME ) #define X48 _EQ(UP ) #define X49 _EQ(PRIOR ) #define X4B _EQ(LEFT ) #define X4D _EQ(RIGHT ) #define X4F _EQ(END ) #define X50 _EQ(DOWN ) #define X51 _EQ(NEXT ) #define X52 _EQ(INSERT ) #define X53 _EQ(DELETE ) #define X5B _EQ(LWIN ) #define X5C _EQ(RWIN ) #define X5D _EQ(APPS ) #define X5E _EQ(POWER ) #define X5F _EQ(SLEEP ) #define X60 _EQ(_none_ ) #define X61 _EQ(_none_ ) #define X62 _EQ(_none_ ) #define X63 _EQ(_none_ ) #define X64 _EQ(_none_ ) #define X65 _EQ(_none_ ) #define X66 _EQ(_none_ ) #define X6D _EQ(_none_ ) #define X71 _EQ(_none_ ) #define X74 _EQ(_none_ ) #define X75 _EQ(_none_ ) #define X76 _EQ(_none_ ) #define X77 _EQ(_none_ ) #define X78 _EQ(_none_ ) #define X79 _EQ(_none_ ) #define X7A _EQ(_none_ ) #define X7B _EQ(_none_ ) /* * The break key is sent to us as E1,LCtrl,NumLock * We must convert the E1+LCtrl to BREAK, then ignore the Numlock * which must be ignored. Alternatively, translate Ctrl-Numlock * to break, but don't let the CTRL through as a WM_KEYUP/DOWN) ? */ #define Y1D _EQ(PAUSE ) #elif (KBD_TYPE == 37) /***********************************************************************\ * T** - Values for ausVK[] (Virtual Scan Code to Virtual Key conversion) * * Three sets of keyboards are supported, according to KBD_TYPE: * * KBD_TYPE Keyboard (examples) * ======== ===================================== * 37 * NEC PC-9800 for Hydra: PC-9800 Keyboard on Windows 95. * * +------+ +----------+ * | Scan | | kbd | * | code | | type 37 | \****+-------+-+----------+*********************************************/ #define T00 _EQ(ESCAPE ) #define T01 _EQ('1' ) #define T02 _EQ('2' ) #define T03 _EQ('3' ) #define T04 _EQ('4' ) #define T05 _EQ('5' ) #define T06 _EQ('6' ) #define T07 _EQ('7' ) #define T08 _EQ('8' ) #define T09 _EQ('9' ) #define T0A _EQ('0' ) #define T0B _EQ(OEM_MINUS ) #define T0C _EQ(OEM_7 ) #define T0D _EQ(OEM_5 ) #define T0E _EQ(BACK ) #define T0F _EQ(TAB ) #define T10 _EQ('Q' ) #define T11 _EQ('W' ) #define T12 _EQ('E' ) #define T13 _EQ('R' ) #define T14 _EQ('T' ) #define T15 _EQ('Y' ) #define T16 _EQ('U' ) #define T17 _EQ('I' ) #define T18 _EQ('O' ) #define T19 _EQ('P' ) #define T1A _EQ(OEM_3 ) #define T1B _EQ(OEM_4 ) #define T1C _EQ(RETURN ) #define T1D _EQ('A' ) #define T1E _EQ('S' ) #define T1F _EQ('D' ) #define T20 _EQ('F' ) #define T21 _EQ('G' ) #define T22 _EQ('H' ) #define T23 _EQ('J' ) #define T24 _EQ('K' ) #define T25 _EQ('L' ) #define T26 _EQ(OEM_PLUS ) #define T27 _EQ(OEM_1 ) #define T28 _EQ(OEM_6 ) #define T29 _EQ('Z' ) #define T2A _EQ('X' ) #define T2B _EQ('C' ) #define T2C _EQ('V' ) #define T2D _EQ('B' ) #define T2E _EQ('N' ) #define T2F _EQ('M' ) #define T30 _EQ(OEM_COMMA ) #define T31 _EQ(OEM_PERIOD) #define T32 _EQ(OEM_2 ) #define T33 _EQ(OEM_8 ) #define T34 _EQ(' ' ) #define T35 _EQ(CONVERT ) #define T36 _EQ(NEXT ) #define T37 _EQ(PRIOR ) #define T38 _EQ(INSERT ) #define T39 _EQ(DELETE ) #define T3A _EQ(UP ) #define T3B _EQ(LEFT ) #define T3C _EQ(RIGHT ) #define T3D _EQ(DOWN ) #define T3E _EQ(HOME ) #define T3F _EQ(END ) #define T40 _EQ(SUBTRACT ) #define T41 _EQ(DIVIDE ) #define T42 _EQ(NUMPAD7 ) #define T43 _EQ(NUMPAD8 ) #define T44 _EQ(NUMPAD9 ) #define T45 _EQ(MULTIPLY ) #define T46 _EQ(NUMPAD4 ) #define T47 _EQ(NUMPAD5 ) #define T48 _EQ(NUMPAD6 ) #define T49 _EQ(ADD ) #define T4A _EQ(NUMPAD1 ) #define T4B _EQ(NUMPAD2 ) #define T4C _EQ(NUMPAD3 ) #define T4D _EQ(OEM_NEC_EQUAL) #define T4E _EQ(NUMPAD0 ) #define T4F _EQ(SEPARATOR ) #define T50 _EQ(DECIMAL ) #define T51 _EQ(NONCONVERT) #define T52 _EQ(F11 ) #define T53 _EQ(F12 ) #define T54 _EQ(F13 ) #define T55 _EQ(F14 ) #define T56 _EQ(F15 ) #define T57 _EQ(_none_ ) #define T58 _EQ(_none_ ) #define T59 _EQ(_none_ ) #define T5A _EQ(_none_ ) #define T5B _EQ(_none_ ) #define T5C _EQ(RETURN ) #define T5D _EQ(_none_ ) #define T5E _EQ(_none_ ) #define T5F _EQ(_none_ ) #define T60 _EQ(CANCEL ) #define T61 _EQ(SNAPSHOT ) #define T62 _EQ(F1 ) #define T63 _EQ(F2 ) #define T64 _EQ(F3 ) #define T65 _EQ(F4 ) #define T66 _EQ(F5 ) #define T67 _EQ(F6 ) #define T68 _EQ(F7 ) #define T69 _EQ(F8 ) #define T6A _EQ(F9 ) #define T6B _EQ(F10 ) #define T6C _EQ(_none_ ) #define T6D _EQ(_none_ ) #define T6E _EQ(_none_ ) #define T6F _EQ(_none_ ) #define T70 _EQ(LSHIFT ) #define T71 _EQ(CAPITAL ) #define T72 _EQ(KANA ) #define T73 _EQ(LMENU ) #define T74 _EQ(LCONTROL ) #define T75 _EQ(_none_ ) #define T76 _EQ(_none_ ) #define T77 _EQ(LWIN ) #define T78 _EQ(RWIN ) #define T79 _EQ(APPS ) #define T7A _EQ(_none_ ) #define T7B _EQ(_none_ ) #define T7C _EQ(_none_ ) #define T7D _EQ(RSHIFT ) #define T7E _EQ(ABNT_C2 ) #define T7F _EQ(OEM_PA2 ) /* * The break key is sent to us as E1,LCtrl,NumLock * We must conevrt the E1+LCtrl to BREAK, then ignore the Numlock * which must be ignored. Alternatively, translate Ctrl-Numlock * to break, but don't let the CTRL through as a WM_KEYUP/DOWN) ? */ #define Y1D _EQ(PAUSE ) #elif (KBD_TYPE >= 40) && (KBD_TYPE <= 41) /***********************************************************************\ * T** - Values for ausVK[] (Virtual Scan Code to Virtual Key conversion) * * Two sets of keyboards are supported, according to KBD_TYPE: * * KBD_TYPE Keyboard (examples) * ======== ===================================== * 40 * DEC LK411-JJ (JIS layout) keyboard * 41 DEC LK411-AJ (ANSI layout) keyboard * * +------+ +-----------+-----------+ * | Scan | | kbd | kbd | * | code | | LK411-JJ | LK411-AJ | \*****+------+-+-----------+-----------+********************************/ #define T00 _EQ( _none_ ) #define T01 _EQ( ESCAPE ) #define T02 _EQ( '1' ) #define T03 _EQ( '2' ) #define T04 _EQ( '3' ) #define T05 _EQ( '4' ) #define T06 _EQ( '5' ) #define T07 _EQ( '6' ) #define T08 _EQ( '7' ) #define T09 _EQ( '8' ) #define T0A _EQ( '9' ) #define T0B _EQ( '0' ) #define T0C _EQ( OEM_MINUS ) #define T0D _NE( OEM_7, OEM_PLUS ) // "^"/"=" #define T0E _EQ( BACK ) #define T0F _EQ( TAB ) #define T10 _EQ( 'Q' ) #define T11 _EQ( 'W' ) #define T12 _EQ( 'E' ) #define T13 _EQ( 'R' ) #define T14 _EQ( 'T' ) #define T15 _EQ( 'Y' ) #define T16 _EQ( 'U' ) #define T17 _EQ( 'I' ) #define T18 _EQ( 'O' ) #define T19 _EQ( 'P' ) #define T1A _NE( OEM_3, OEM_4 ) // "@"/"[" #define T1B _NE( OEM_4, OEM_6 ) // "["/"]" #define T1C _EQ( RETURN ) #define T1D _EQ( LCONTROL ) #define T1E _EQ( 'A' ) #define T1F _EQ( 'S' ) #define T20 _EQ( 'D' ) #define T21 _EQ( 'F' ) #define T22 _EQ( 'G' ) #define T23 _EQ( 'H' ) #define T24 _EQ( 'J' ) #define T25 _EQ( 'K' ) #define T26 _EQ( 'L' ) #define T27 _NE( OEM_PLUS, OEM_1 ) // ";" #define T28 _NE( OEM_1, OEM_7 ) // ":"/"'" #define T29 _NE( _none_, DBE_SBCSCHAR ) // LK411AJ uses "<>" as SBCS/DBCS key #define T2A _EQ( LSHIFT ) #define T2B _NE( OEM_6, OEM_5 ) // "]"/"\" #define T2C _EQ( 'Z' ) #define T2D _EQ( 'X' ) #define T2E _EQ( 'C' ) #define T2F _EQ( 'V' ) #define T30 _EQ( 'B' ) #define T31 _EQ( 'N' ) #define T32 _EQ( 'M' ) #define T33 _EQ( OEM_COMMA ) #define T34 _EQ( OEM_PERIOD ) #define T35 _EQ( OEM_2 ) // "/" #define T36 _EQ( RSHIFT ) #define T37 _EQ( MULTIPLY ) // PF3 : "*" #define T38 _EQ( LMENU ) // Alt(Left) #define T39 _EQ( ' ' ) // Space #define T3A _EQ( CAPITAL ) // LOCK : Caps Lock #define T3B _EQ( F1 ) #define T3C _EQ( F2 ) #define T3D _EQ( F3 ) #define T3E _EQ( F4 ) #define T3F _EQ( F5 ) #define T40 _EQ( F6 ) #define T41 _EQ( F7 ) #define T42 _EQ( F8 ) #define T43 _EQ( F9 ) #define T44 _EQ( F10 ) #define T45 _EQ( NUMLOCK ) // PF1 : Num Lock #define T46 _EQ( SCROLL ) // F19 : Scroll Lock #define T47 _EQ( HOME ) // KP7 : Home #define T48 _EQ( UP ) // KP8 : Up #define T49 _EQ( PRIOR ) // KP9 : Page Up #define T4A _EQ( SUBTRACT ) // PF4 : "-" #define T4B _EQ( LEFT ) // KP4 : Left #define T4C _EQ( CLEAR ) // KP5 : Clear #define T4D _EQ( RIGHT ) // KP6 : Right #define T4E _EQ( ADD ) // KP, : Add #define T4F _EQ( END ) // KP1 : End #define T50 _EQ( DOWN ) // KP2 : Down #define T51 _EQ( NEXT ) // KP3 : Next #define T52 _EQ( INSERT ) // KP0 : Ins #define T53 _EQ( DELETE ) // KP. : Del #define T54 _EQ( SNAPSHOT ) #define T55 _EQ( _none_ ) #define T56 _EQ( _none_ ) #define T57 _EQ( F11 ) #define T58 _EQ( F12 ) #define T59 _EQ( _none_ ) #define T5A _EQ( _none_ ) #define T5B _EQ( _none_ ) #define T5C _EQ( _none_ ) #define T5D _EQ( _none_ ) #define T5E _EQ( _none_ ) #define T5F _EQ( _none_ ) #define T60 _EQ( _none_ ) #define T61 _EQ( _none_ ) #define T62 _EQ( _none_ ) #define T63 _EQ( _none_ ) #define T64 _EQ( _none_ ) #define T65 _EQ( _none_ ) #define T66 _EQ( _none_ ) #define T67 _EQ( _none_ ) #define T68 _EQ( _none_ ) #define T69 _EQ( _none_ ) #define T6A _EQ( _none_ ) #define T6B _EQ( _none_ ) #define T6C _EQ( _none_ ) #define T6D _EQ( _none_ ) #define T6E _EQ( _none_ ) #define T6F _EQ( _none_ ) #define T70 _EQ( DBE_HIRAGANA ) // Hiragana/Katakana #define T71 _EQ( _none_ ) #define T72 _EQ( _none_ ) #define T73 _NE( OEM_102, _none_ ) // LK411JJ, Katakana "Ro" #define T74 _EQ( _none_ ) #define T75 _EQ( _none_ ) #define T76 _EQ( _none_ ) #define T77 _EQ( _none_ ) #define T78 _EQ( _none_ ) #define T79 _EQ( CONVERT ) // Henkan #define T7A _EQ( _none_ ) #define T7B _EQ( NONCONVERT ) // Mu-Henkan #define T7C _EQ( _none_ ) #define T7D _NE( OEM_5, _none_ ) // LK411JJ, Yen(Back-slash) #define T7E _EQ( _none_ ) #define T7F _EQ( _none_ ) #define X0F _EQ( KANA ) // Kana #define X1C _EQ( RETURN ) // Enter #define X1D _EQ( RCONTROL ) // Comp : Right Control #define X33 _EQ( _none_ ) #define X35 _EQ( DIVIDE ) // PF2: "/" #define X37 _EQ( SNAPSHOT ) // F18: PrintScreen #define X38 _EQ( RMENU ) // Alt(Right) #define X3D _EQ( F13 ) #define X3E _EQ( F14 ) #define X3F _EQ( F15 ) // Help : F15 #define X40 _EQ( F16 ) // Do : F16 #define X41 _EQ( F17 ) #define X42 _EQ( _none_ ) #define X43 _EQ( _none_ ) #define X44 _EQ( _none_ ) #define X46 _EQ( CANCEL ) #define X47 _EQ( HOME ) // Find : HOME #define X48 _EQ( UP ) #define X49 _EQ( PRIOR ) // Prev : PageUp #define X4B _EQ( LEFT ) #define X4D _EQ( RIGHT ) #define X4E _EQ( ADD ) // KP- (Minus but "Add") #define X4F _EQ( END ) // Select : END #define X50 _EQ( DOWN ) #define X51 _EQ( NEXT ) // Next : PageDown #define X52 _EQ( INSERT ) #define X53 _EQ( DELETE ) // Remove #define X5B _EQ( _none_ ) #define X5C _EQ( _none_ ) #define X5D _EQ( _none_ ) #define X5E _EQ( POWER ) #define X5F _EQ( SLEEP ) /* * The break key is sent to us as E1,LCtrl,NumLock * We must convert the E1+LCtrl to BREAK, then ignore the Numlock */ #define Y1D _EQ( PAUSE ) #endif // KBD_TYPE #define SCANCODE_LSHIFT 0x2A #define SCANCODE_RSHIFT 0x36 #define SCANCODE_CTRL 0x1D #define SCANCODE_ALT 0x38 #define SCANCODE_SIMULATED (FAKE_KEYSTROKE >> 16) #define SCANCODE_NUMPAD_FIRST 0x47 #define SCANCODE_NUMPAD_LAST 0x52 #define SCANCODE_LWIN 0x5B #define SCANCODE_RWIN 0x5C #define SCANCODE_THAI_LAYOUT_TOGGLE 0x29 //@@BEGIN_DDKSPLIT /* * Hydra FarEast */ /* * Structure for client keyboard information */ typedef struct _CLIENTKEYBOARDTYPE { ULONG Type; ULONG SubType; ULONG FunctionKey; } CLIENTKEYBOARDTYPE, *KBD_LONG_POINTER PCLIENTKEYBOARDTYPE; //@@END_DDKSPLIT //@@BEGIN_DDKSPLIT #if !defined(VK_DBE_ALPHANUMERIC) //@@END_DDKSPLIT #define VK_DBE_ALPHANUMERIC 0x0f0 #define VK_DBE_KATAKANA 0x0f1 #define VK_DBE_HIRAGANA 0x0f2 #define VK_DBE_SBCSCHAR 0x0f3 #define VK_DBE_DBCSCHAR 0x0f4 #define VK_DBE_ROMAN 0x0f5 #define VK_DBE_NOROMAN 0x0f6 #define VK_DBE_ENTERWORDREGISTERMODE 0x0f7 #define VK_DBE_ENTERIMECONFIGMODE 0x0f8 #define VK_DBE_FLUSHSTRING 0x0f9 #define VK_DBE_CODEINPUT 0x0fa #define VK_DBE_NOCODEINPUT 0x0fb #define VK_DBE_DETERMINESTRING 0x0fc #define VK_DBE_ENTERDLGCONVERSIONMODE 0x0fd //@@BEGIN_DDKSPLIT #endif //@@END_DDKSPLIT #endif // _KBD_