Main Page | Class Hierarchy | Class List | File List | Class Members | File Members

kbd106.c

Go to the documentation of this file.
00001 /***************************************************************************\ 00002 * Module Name: kbd106.c 00003 * 00004 * Copyright (c) 1985-92, Microsoft Corporation 00005 * 00006 * History: 00007 \***************************************************************************/ 00008 00009 #include <nt.h> 00010 #include <ntrtl.h> 00011 #include <nturtl.h> 00012 #include <windows.h> 00013 #include <ime.h> 00014 #include "vkoem.h" 00015 #include "kbdjpn.h" 00016 #include "kbd106.h" 00017 00018 #if defined(_M_IA64) 00019 #pragma section(".data") 00020 #define ALLOC_SECTION_LDATA __declspec(allocate(".data")) 00021 #else 00022 #pragma data_seg(".data") 00023 #define ALLOC_SECTION_LDATA 00024 #endif 00025 00026 /***************************************************************************\ 00027 * ausVK[] - Virtual Scan Code to Virtual Key conversion table for 106 00028 \***************************************************************************/ 00029 00030 static ALLOC_SECTION_LDATA USHORT ausVK[] = { 00031 T00, T01, T02, T03, T04, T05, T06, T07, 00032 T08, T09, T0A, T0B, T0C, T0D, T0E, T0F, 00033 T10, T11, T12, T13, T14, T15, T16, T17, 00034 T18, T19, T1A, T1B, T1C, T1D, T1E, T1F, 00035 T20, T21, T22, T23, T24, T25, T26, T27, 00036 T28, 00037 00038 /* 00039 * Hankaku/Zenkaku/Kanji key must have KBDSPECIAL bit set (NLS key) 00040 */ 00041 T29 | KBDSPECIAL, 00042 00043 T2A, T2B, T2C, T2D, T2E, T2F, 00044 T30, T31, T32, T33, T34, T35, 00045 00046 /* 00047 * Right-hand Shift key must have KBDEXT bit set. 00048 */ 00049 T36 | KBDEXT, 00050 00051 /* 00052 * numpad_* + Shift/Alt -> SnapShot 00053 */ 00054 T37 | KBDMULTIVK, 00055 00056 T38, T39, 00057 00058 /* 00059 * Alphanumeric/CapsLock key must have KBDSPECIAL bit set (NLS key) 00060 */ 00061 T3A | KBDSPECIAL, 00062 00063 T3B, T3C, T3D, T3E, T3F, 00064 T40, T41, T42, T43, T44, 00065 00066 /* 00067 * NumLock Key: 00068 * KBDEXT - VK_NUMLOCK is an Extended key 00069 * KBDMULTIVK - VK_NUMLOCK or VK_PAUSE (without or with CTRL) 00070 */ 00071 T45 | KBDEXT | KBDMULTIVK, 00072 00073 T46 | KBDMULTIVK, 00074 00075 /* 00076 * Number Pad keys: 00077 * KBDNUMPAD - digits 0-9 and decimal point. 00078 * KBDSPECIAL - require special processing by Windows 00079 */ 00080 T47 | KBDNUMPAD | KBDSPECIAL, // Numpad 7 (Home) 00081 T48 | KBDNUMPAD | KBDSPECIAL, // Numpad 8 (Up), 00082 T49 | KBDNUMPAD | KBDSPECIAL, // Numpad 9 (PgUp), 00083 T4A, 00084 T4B | KBDNUMPAD | KBDSPECIAL, // Numpad 4 (Left), 00085 T4C | KBDNUMPAD | KBDSPECIAL, // Numpad 5 (Clear), 00086 T4D | KBDNUMPAD | KBDSPECIAL, // Numpad 6 (Right), 00087 T4E, 00088 T4F | KBDNUMPAD | KBDSPECIAL, // Numpad 1 (End), 00089 T50 | KBDNUMPAD | KBDSPECIAL, // Numpad 2 (Down), 00090 T51 | KBDNUMPAD | KBDSPECIAL, // Numpad 3 (PgDn), 00091 T52 | KBDNUMPAD | KBDSPECIAL, // Numpad 0 (Ins), 00092 T53 | KBDNUMPAD | KBDSPECIAL, // Numpad . (Del), 00093 00094 T54, T55, T56, T57, T58, T59, T5A, T5B, 00095 T5C, T5D, T5E, T5F, T60, T61, T62, T63, 00096 T64, T65, T66, T67, T68, T69, T6A, T6B, 00097 T6C, T6D, T6E, T6F, 00098 00099 /* 00100 * Hiragana/Katakana/Roman key must have KBDSPECIAL bit set (NLS key) 00101 */ 00102 T70 | KBDSPECIAL, 00103 00104 T71, T72, T73, 00105 T74, T75, T76, T77, T78, 00106 00107 /* 00108 * Conversion key must have KBDSPECIAL bit set (NLS key) 00109 */ 00110 T79 | KBDSPECIAL, 00111 00112 T7A, 00113 00114 /* 00115 * Non-Conversion key must have KBDSPECIAL bit set (NLS key) 00116 */ 00117 T7B | KBDSPECIAL, 00118 00119 T7C, T7D, T7E, T7F 00120 00121 }; 00122 00123 static ALLOC_SECTION_LDATA VSC_VK aE0VscToVk[] = { 00124 { 0x10, X10 | KBDEXT }, // Speedracer: Previous Track 00125 { 0x19, X19 | KBDEXT }, // Speedracer: Next Track 00126 { 0x1C, X1C | KBDEXT }, // Numpad Enter 00127 { 0x1D, X1D | KBDEXT }, // RControl 00128 { 0x20, X20 | KBDEXT }, // Speedracer: Volume Mute 00129 { 0x21, X21 | KBDEXT }, // Speedracer: Launch App 2 00130 { 0x22, X22 | KBDEXT }, // Speedracer: Media Play/Pause 00131 { 0x24, X24 | KBDEXT }, // Speedracer: Media Stop 00132 { 0x2E, X2E | KBDEXT }, // Speedracer: Volume Down 00133 { 0x30, X30 | KBDEXT }, // Speedracer: Volume Up 00134 { 0x32, X32 | KBDEXT }, // Speedracer: Browser Home 00135 { 0x35, X35 | KBDEXT }, // Numpad Divide 00136 { 0x37, X37 | KBDEXT }, // Snapshot 00137 { 0x38, X38 | KBDEXT }, // RMenu 00138 { 0x46, X46 | KBDEXT }, // Break (Ctrl + Pause) 00139 { 0x47, X47 | KBDEXT }, // Home 00140 { 0x48, X48 | KBDEXT }, // Up 00141 { 0x49, X49 | KBDEXT }, // Prior 00142 { 0x4B, X4B | KBDEXT }, // Left 00143 { 0x4D, X4D | KBDEXT }, // Right 00144 { 0x4F, X4F | KBDEXT }, // End 00145 { 0x50, X50 | KBDEXT }, // Down 00146 { 0x51, X51 | KBDEXT }, // Next 00147 { 0x52, X52 | KBDEXT }, // Insert 00148 { 0x53, X53 | KBDEXT }, // Delete 00149 { 0x5B, X5B | KBDEXT }, // Left Win 00150 { 0x5C, X5C | KBDEXT }, // Right Win 00151 { 0x5D, X5D | KBDEXT }, // Application 00152 { 0x5F, X5F | KBDEXT }, // Speedracer: Sleep 00153 { 0x65, X65 | KBDEXT }, // Speedracer: Browser Search 00154 { 0x66, X66 | KBDEXT }, // Speedracer: Browser Favorites 00155 { 0x67, X67 | KBDEXT }, // Speedracer: Browser Refresh 00156 { 0x68, X68 | KBDEXT }, // Speedracer: Browser Stop 00157 { 0x69, X69 | KBDEXT }, // Speedracer: Browser Forward 00158 { 0x6A, X6A | KBDEXT }, // Speedracer: Browser Back 00159 { 0x6B, X6B | KBDEXT }, // Speedracer: Launch App 1 00160 { 0x6C, X6C | KBDEXT }, // Speedracer: Launch Mail 00161 { 0x6D, X6D | KBDEXT }, // Speedracer: Launch Media Selector 00162 { 0, 0 } 00163 }; 00164 00165 static ALLOC_SECTION_LDATA VSC_VK aE1VscToVk[] = { 00166 { 0x1D, Y1D }, // Pause 00167 { 0 , 0 } 00168 }; 00169 00170 /***************************************************************************\ 00171 * aVkToBits[] - map Virtual Keys to Modifier Bits 00172 * 00173 * See kbd.h for a full description. 00174 * 00175 * US Keyboard has only three shifter keys: 00176 * SHIFT (L & R) affects alphabnumeric keys, 00177 * CTRL (L & R) is used to generate control characters 00178 * ALT (L & R) used for generating characters by number with numpad 00179 \***************************************************************************/ 00180 00181 static ALLOC_SECTION_LDATA VK_TO_BIT aVkToBits[] = { 00182 { VK_SHIFT, KBDSHIFT }, 00183 { VK_CONTROL, KBDCTRL }, 00184 { VK_MENU, KBDALT }, 00185 { VK_KANA, KBDKANA }, 00186 { 0, 0 } 00187 }; 00188 00189 /***************************************************************************\ 00190 * aModification[] - map character modifier bits to modification number 00191 * 00192 * See kbd.h for a full description. 00193 * 00194 \***************************************************************************/ 00195 00196 static ALLOC_SECTION_LDATA MODIFIERS CharModifiers = { 00197 &aVkToBits[0], 00198 11, 00199 { 00200 // Modification# // Keys Pressed : Explanation 00201 // ============= // ============== : ============================= 00202 0, // : unshifted characters 00203 1, // SHIFT : capitals, ~!@#$%^&*()_+{}:"<>? etc. 00204 4, // CTRL : control characters 00205 6, // CTRL SHIFT : 00206 SHFT_INVALID, // ALT : invalid 00207 SHFT_INVALID, // ALT SHIFT : invalid 00208 SHFT_INVALID, // ALT CTRL : invalid 00209 SHFT_INVALID, // ALT CTRL SHIFT : invalid 00210 2, //KANA 00211 3, //KANA SHIFT 00212 5, //KANA CTRL 00213 7 //KANA CTRL SHIFT 00214 } 00215 }; 00216 00217 /***************************************************************************\ 00218 * 00219 * aVkToWch2[] - Virtual Key to WCHAR translation for 2 shift states 00220 * aVkToWch3[] - Virtual Key to WCHAR translation for 3 shift states 00221 * aVkToWch4[] - Virtual Key to WCHAR translation for 4 shift states 00222 * 00223 * Table attributes: Unordered Scan, null-terminated 00224 * 00225 * Search this table for an entry with a matching Virtual Key to find the 00226 * corresponding unshifted and shifted WCHAR characters. 00227 * 00228 * Reserved VirtualKey values (first column) 00229 * -1 - this line contains dead characters (diacritic) 00230 * 0 - terminator 00231 * 00232 * Reserved Attribute values (second column) 00233 * CAPLOK - CapsLock affects this key like Shift 00234 * KANALOK - The KANA-LOCK key affects this key like KANA 00235 * 00236 * Reserved character values (third through last column) 00237 * WCH_NONE - No character 00238 * WCH_DEAD - Dead character (diacritic) value is in next line 00239 * 00240 \***************************************************************************/ 00241 00242 static ALLOC_SECTION_LDATA VK_TO_WCHARS4 aVkToWch4[] = { 00243 // | | SHIFT | KANA | K+SHFT | 00244 // | |==========|========|========| 00245 {'0' , KANALOK ,'0' ,WCH_NONE ,WCH_WA ,WCH_WO }, 00246 {'1' , KANALOK ,'1' ,'!' ,WCH_NU ,WCH_NU }, 00247 {'3' , KANALOK ,'3' ,'#' ,WCH_A ,WCH_AA }, 00248 {'4' , KANALOK ,'4' ,'$' ,WCH_U ,WCH_UU }, 00249 {'5' , KANALOK ,'5' ,'%' ,WCH_E ,WCH_EE }, 00250 {'7' , KANALOK ,'7' ,0x27 ,WCH_YA ,WCH_YAA }, 00251 {'8' , KANALOK ,'8' ,'(' ,WCH_YU ,WCH_YUU }, 00252 {'9' , KANALOK ,'9' ,')' ,WCH_YO ,WCH_YOO }, 00253 {'A' , CAPLOK | KANALOK ,'a' ,'A' ,WCH_TI ,WCH_TI }, 00254 {'B' , CAPLOK | KANALOK ,'b' ,'B' ,WCH_KO ,WCH_KO }, 00255 {'C' , CAPLOK | KANALOK ,'c' ,'C' ,WCH_SO ,WCH_SO }, 00256 {'D' , CAPLOK | KANALOK ,'d' ,'D' ,WCH_SI ,WCH_SI }, 00257 {'E' , CAPLOK | KANALOK ,'e' ,'E' ,WCH_I ,WCH_II }, 00258 {'F' , CAPLOK | KANALOK ,'f' ,'F' ,WCH_HA ,WCH_HA }, 00259 {'G' , CAPLOK | KANALOK ,'g' ,'G' ,WCH_KI ,WCH_KI }, 00260 {'H' , CAPLOK | KANALOK ,'h' ,'H' ,WCH_KU ,WCH_KU }, 00261 {'I' , CAPLOK | KANALOK ,'i' ,'I' ,WCH_NI ,WCH_NI }, 00262 {'J' , CAPLOK | KANALOK ,'j' ,'J' ,WCH_MA ,WCH_MA }, 00263 {'K' , CAPLOK | KANALOK ,'k' ,'K' ,WCH_NO ,WCH_NO }, 00264 {'L' , CAPLOK | KANALOK ,'l' ,'L' ,WCH_RI ,WCH_RI }, 00265 {'M' , CAPLOK | KANALOK ,'m' ,'M' ,WCH_MO ,WCH_MO }, 00266 {'N' , CAPLOK | KANALOK ,'n' ,'N' ,WCH_MI ,WCH_MI }, 00267 {'O' , CAPLOK | KANALOK ,'o' ,'O' ,WCH_RA ,WCH_RA }, 00268 {'P' , CAPLOK | KANALOK ,'p' ,'P' ,WCH_SE ,WCH_SE }, 00269 {'Q' , CAPLOK | KANALOK ,'q' ,'Q' ,WCH_TA ,WCH_TA }, 00270 {'R' , CAPLOK | KANALOK ,'r' ,'R' ,WCH_SU ,WCH_SU }, 00271 {'S' , CAPLOK | KANALOK ,'s' ,'S' ,WCH_TO ,WCH_TO }, 00272 {'T' , CAPLOK | KANALOK ,'t' ,'T' ,WCH_KA ,WCH_KA }, 00273 {'U' , CAPLOK | KANALOK ,'u' ,'U' ,WCH_NA ,WCH_NA }, 00274 {'V' , CAPLOK | KANALOK ,'v' ,'V' ,WCH_HI ,WCH_HI }, 00275 {'W' , CAPLOK | KANALOK ,'w' ,'W' ,WCH_TE ,WCH_TE }, 00276 {'X' , CAPLOK | KANALOK ,'x' ,'X' ,WCH_SA ,WCH_SA }, 00277 {'Y' , CAPLOK | KANALOK ,'y' ,'Y' ,WCH_NN ,WCH_NN }, 00278 {'Z' , CAPLOK | KANALOK ,'z' ,'Z' ,WCH_TU ,WCH_TUU }, 00279 {VK_OEM_1 , KANALOK ,':' ,'*' ,WCH_KE ,WCH_KE }, 00280 {VK_OEM_2 , KANALOK ,'/' ,'?' ,WCH_ME ,WCH_MD }, 00281 {VK_OEM_3 , KANALOK ,'@' ,'`' ,WCH_VS ,WCH_VS }, 00282 {VK_OEM_7 , KANALOK ,'^' ,'~' ,WCH_HE ,WCH_HE }, 00283 {VK_OEM_8 , 0 ,WCH_NONE ,WCH_NONE ,WCH_NONE,WCH_NONE}, 00284 {VK_OEM_COMMA , KANALOK ,',' ,'<' ,WCH_NE ,WCH_IC }, 00285 {VK_OEM_PERIOD, KANALOK ,'.' ,'>' ,WCH_RU ,WCH_IP }, 00286 {VK_OEM_PLUS , KANALOK ,';' ,'+' ,WCH_RE ,WCH_RE }, 00287 {VK_TAB , 0 ,'\t' ,'\t' ,'\t' ,'\t' }, 00288 {VK_ADD , 0 ,'+' ,'+' ,'+' ,'+' }, 00289 {VK_DECIMAL , 0 ,'.' ,'.' ,'.' ,'.' }, 00290 {VK_DIVIDE , 0 ,'/' ,'/' ,'/' ,'/' }, 00291 {VK_MULTIPLY , 0 ,'*' ,'*' ,'*' ,'*' }, 00292 {VK_SUBTRACT , 0 ,'-' ,'-' ,'-' ,'-' }, 00293 {0 , 0 ,0 ,0 ,0 ,0 } 00294 }; 00295 00296 static ALLOC_SECTION_LDATA VK_TO_WCHARS6 aVkToWch6[] = { 00297 // | | SHIFT | KANA | K+SHFT | CONTROL | K+CTRL | 00298 // | |==========|========|========|===========|===========| 00299 {VK_BACK , 0 ,'\b' ,'\b' ,'\b' ,'\b' , 0x7f , 0x7f }, 00300 {VK_CANCEL , 0 ,0x03 ,0x03 ,0x03 ,0x03 , 0x03 , 0x03 }, 00301 {VK_ESCAPE , 0 ,0x1b ,0x1b ,0x1b ,0x1b , 0x1b , 0x1b }, 00302 {VK_OEM_4 , KANALOK ,'[' ,'{' ,WCH_SVS ,WCH_OB , 0x1b , 0x1b }, 00303 {VK_OEM_5 , KANALOK ,'\\' ,'|' ,WCH_PS ,WCH_PS , 0x1c , 0x1c }, 00304 {VK_OEM_102 , KANALOK ,'\\' ,'_' ,WCH_RO ,WCH_RO , 0x1c , 0x1c }, 00305 {VK_OEM_6 , KANALOK ,']' ,'}' ,WCH_MU ,WCH_CB , 0x1d , 0x1d }, 00306 {VK_RETURN , 0 ,'\r' ,'\r' ,'\r' ,'\r' , '\n' , '\n' }, 00307 {VK_SPACE , 0 ,' ' ,' ' ,' ' ,' ' , 0x20 , 0x20 }, 00308 {0 , 0 ,0 ,0 ,0 ,0 , 0 , 0 } 00309 }; 00310 00311 static ALLOC_SECTION_LDATA VK_TO_WCHARS8 aVkToWch8[] = { 00312 // | | SHIFT | KANA | K+SHFT | CONTROL | K+CTRL | SHFT+CTRL |K+SHFT+CTRL| 00313 // | |==========|========|========|===========|===========|===========|===========| 00314 {'2' , KANALOK ,'2' ,'"' ,WCH_HU ,WCH_HU , WCH_NONE , WCH_NONE , 0x00 , 0x00 }, 00315 {'6' , KANALOK ,'6' ,'&' ,WCH_O ,WCH_OO , WCH_NONE , WCH_NONE , 0x1e , 0x1e }, 00316 {VK_OEM_MINUS , KANALOK ,'-' ,'=' ,WCH_HO ,WCH_HO , WCH_NONE , WCH_NONE , 0x1f , 0x1f }, 00317 {0 , 0 ,0 ,0 ,0 ,0 , 0 , 0 , 0 , 0 } 00318 }; 00319 00320 // Put this last so that VkKeyScan interprets number characters 00321 // as coming from the main section of the kbd (aVkToWch2 and 00322 // aVkToWch4) before considering the numpad (aVkToWch1). 00323 00324 static ALLOC_SECTION_LDATA VK_TO_WCHARS4 aVkToWch1[] = { 00325 // | | SHIFT | KANA | K+SHFT | 00326 // | |==========|========|========| 00327 { VK_NUMPAD0 , 0 , '0' , WCH_NONE , '0' ,WCH_NONE}, 00328 { VK_NUMPAD1 , 0 , '1' , WCH_NONE , '1' ,WCH_NONE}, 00329 { VK_NUMPAD2 , 0 , '2' , WCH_NONE , '2' ,WCH_NONE}, 00330 { VK_NUMPAD3 , 0 , '3' , WCH_NONE , '3' ,WCH_NONE}, 00331 { VK_NUMPAD4 , 0 , '4' , WCH_NONE , '4' ,WCH_NONE}, 00332 { VK_NUMPAD5 , 0 , '5' , WCH_NONE , '5' ,WCH_NONE}, 00333 { VK_NUMPAD6 , 0 , '6' , WCH_NONE , '6' ,WCH_NONE}, 00334 { VK_NUMPAD7 , 0 , '7' , WCH_NONE , '7' ,WCH_NONE}, 00335 { VK_NUMPAD8 , 0 , '8' , WCH_NONE , '8' ,WCH_NONE}, 00336 { VK_NUMPAD9 , 0 , '9' , WCH_NONE , '9' ,WCH_NONE}, 00337 { 0 , 0 , '\0' , 0 , 0 ,0 } //null terminator 00338 }; 00339 00340 /***************************************************************************\ 00341 * aVkToWcharTable: table of pointers to Character Tables 00342 * 00343 * Describes the character tables and the order they should be searched. 00344 * 00345 * Note: the order determines the behavior of VkKeyScan() : this function 00346 * takes a character and attempts to find a Virtual Key and character- 00347 * modifier key combination that produces that character. The table 00348 * containing the numeric keypad (aVkToWch1) must appear last so that 00349 * VkKeyScan('0') will be interpreted as one of keys from the main 00350 * section, not the numpad. etc. 00351 \***************************************************************************/ 00352 00353 static ALLOC_SECTION_LDATA VK_TO_WCHAR_TABLE aVkToWcharTable[] = { 00354 { (PVK_TO_WCHARS1)aVkToWch6, 6, sizeof(aVkToWch6[0]) }, 00355 { (PVK_TO_WCHARS1)aVkToWch8, 8, sizeof(aVkToWch8[0]) }, 00356 { (PVK_TO_WCHARS1)aVkToWch4, 4, sizeof(aVkToWch4[0]) }, 00357 { (PVK_TO_WCHARS1)aVkToWch1, 4, sizeof(aVkToWch1[0]) }, // must come last 00358 { NULL, 0, 0 } 00359 }; 00360 00361 /***************************************************************************\ 00362 * aKeyNames[], aKeyNamesExt[] - Scan Code -> Key Name tables 00363 * 00364 * For the GetKeyNameText() API function 00365 * 00366 * Tables for non-extended and extended (KBDEXT) keys. 00367 * (Keys producing printable characters are named by the character itself) 00368 \***************************************************************************/ 00369 00370 static ALLOC_SECTION_LDATA VSC_LPWSTR aKeyNames[] = { 00371 0x01, L"Esc", 00372 0x0e, L"Backspace", 00373 0x0f, L"Tab", 00374 0x1c, L"Enter", 00375 0x1d, L"Ctrl", 00376 0x29, (LPWSTR)SZ_KEY_NAME_HANKAKU_ZENKAKU, // NLS Key 00377 0x2a, L"Shift", 00378 0x36, L"Right Shift", 00379 0x37, L"Num *", 00380 0x38, L"Alt", 00381 0x39, L"Space", 00382 0x3a, L"Caps Lock", 00383 0x3b, L"F1", 00384 0x3c, L"F2", 00385 0x3d, L"F3", 00386 0x3e, L"F4", 00387 0x3f, L"F5", 00388 0x40, L"F6", 00389 0x41, L"F7", 00390 0x42, L"F8", 00391 0x43, L"F9", 00392 0x44, L"F10", 00393 0x45, L"Pause", 00394 0x46, L"Scroll Lock", 00395 0x47, L"Num 7", 00396 0x48, L"Num 8", 00397 0x49, L"Num 9", 00398 0x4a, L"Num -", 00399 0x4b, L"Num 4", 00400 0x4c, L"Num 5", 00401 0x4d, L"Num 6", 00402 0x4e, L"Num +", 00403 0x4f, L"Num 1", 00404 0x50, L"Num 2", 00405 0x51, L"Num 3", 00406 0x52, L"Num 0", 00407 0x53, L"Num Del", 00408 0x54, L"Sys Req", 00409 0x57, L"F11", 00410 0x58, L"F12", 00411 0x70, (LPWSTR)SZ_KEY_NAME_HIRAGANA, 00412 0x79, (LPWSTR)SZ_KEY_NAME_HENKAN, 00413 0x7b, (LPWSTR)SZ_KEY_NAME_MUHENKAN, 00414 0x7C, L"F13", 00415 0 , NULL 00416 }; 00417 00418 static ALLOC_SECTION_LDATA VSC_LPWSTR aKeyNamesExt[] = { 00419 0x1c, L"Num Enter", 00420 0x1d, L"Right Control", 00421 0x35, L"Num /", 00422 0x37, L"Prnt Scrn", 00423 0x38, L"Right Alt", 00424 0x45, L"Num Lock", 00425 0x46, L"Break", 00426 0x47, L"Home", 00427 0x48, L"Up", 00428 0x49, L"Page Up", 00429 0x4b, L"Left", 00430 0x4d, L"Right", 00431 0x4f, L"End", 00432 0x50, L"Down", 00433 0x51, L"Page Down", 00434 0x52, L"Insert", 00435 0x53, L"Delete", 00436 0x5B, L"Left Windows", 00437 0x5C, L"Right Windows", 00438 0x5D, L"Application", 00439 0 , NULL 00440 }; 00441 00442 static ALLOC_SECTION_LDATA KBDTABLES KbdTables = { 00443 /* 00444 * Modifier keys 00445 */ 00446 &CharModifiers, 00447 00448 /* 00449 * Characters tables 00450 */ 00451 aVkToWcharTable, 00452 00453 /* 00454 * Diacritics (none for US English) 00455 */ 00456 NULL, 00457 00458 /* 00459 * Names of Keys (no dead keys) 00460 */ 00461 aKeyNames, 00462 aKeyNamesExt, 00463 NULL, 00464 00465 /* 00466 * Scan codes to Virtual Keys 00467 */ 00468 ausVK, 00469 sizeof(ausVK) / sizeof(ausVK[0]), 00470 aE0VscToVk, 00471 aE1VscToVk, 00472 00473 /* 00474 * No Locale-specific special processing 00475 */ 00476 0 00477 }; 00478 00479 PKBDTABLES KbdLayerDescriptor(VOID) 00480 { 00481 return &KbdTables; 00482 } 00483 00484 /***********************************************************************\ 00485 * VkToFuncTable_106[] 00486 * 00487 \***********************************************************************/ 00488 00489 static ALLOC_SECTION_LDATA VK_F VkToFuncTable_106[] = { 00490 { 00491 VK_DBE_ALPHANUMERIC, // Base Vk 00492 KBDNLS_TYPE_TOGGLE, // NLSFEProcType 00493 KBDNLS_INDEX_NORMAL, // NLSFEProcCurrent 00494 0x02, /* 00000010 */ // NLSFEProcSwitch 00495 { // NLSFEProc 00496 {KBDNLS_ALPHANUM,0}, // Base 00497 {KBDNLS_SEND_PARAM_VK,VK_CAPITAL}, // Shift 00498 {KBDNLS_ALPHANUM,0}, // Control 00499 {KBDNLS_ALPHANUM,0}, // Shift+Control 00500 {KBDNLS_ALPHANUM,0}, // Alt 00501 {KBDNLS_ALPHANUM,0}, // Shift+Alt 00502 {KBDNLS_CODEINPUT,0}, // Control+Alt 00503 {KBDNLS_CODEINPUT,0} // Shift+Control+Alt 00504 }, 00505 { // NLSFEProcAlt 00506 {KBDNLS_SEND_PARAM_VK,VK_CAPITAL}, // Base 00507 {KBDNLS_SEND_PARAM_VK,VK_CAPITAL}, // Shift 00508 {KBDNLS_NOEVENT,0}, // Control 00509 {KBDNLS_NOEVENT,0}, // Shift+Control 00510 {KBDNLS_NOEVENT,0}, // Alt 00511 {KBDNLS_NOEVENT,0}, // Shift+Alt 00512 {KBDNLS_NOEVENT,0}, // Control+Alt 00513 {KBDNLS_NOEVENT,0} // Shift+Control+Alt 00514 } 00515 }, 00516 { 00517 VK_DBE_HIRAGANA, // Base Vk 00518 KBDNLS_TYPE_TOGGLE, // NLSFEProcType 00519 KBDNLS_INDEX_NORMAL, // NLSFEProcCurrent 00520 0x08, /* 00001000 */ // NLSFEProcSwitch 00521 { // NLSFEProc 00522 {KBDNLS_HIRAGANA,0}, // Base 00523 {KBDNLS_KATAKANA,0}, // Shift 00524 {KBDNLS_HIRAGANA,0}, // Control 00525 {KBDNLS_SEND_PARAM_VK,VK_KANA}, // Shift+Control 00526 {KBDNLS_ROMAN,0}, // Alt 00527 {KBDNLS_ROMAN,0}, // Shift+Alt 00528 {KBDNLS_ROMAN,0}, // Control+Alt 00529 {KBDNLS_NOEVENT,0} // Shift+Control+Alt 00530 }, 00531 { // NLSFEProcIndexAlt 00532 {KBDNLS_SEND_PARAM_VK,VK_KANA}, // Base 00533 {KBDNLS_SEND_PARAM_VK,VK_KANA}, // Shift 00534 {KBDNLS_SEND_PARAM_VK,VK_KANA}, // Control 00535 {KBDNLS_SEND_PARAM_VK,VK_KANA}, // Shift+Control 00536 {KBDNLS_NOEVENT,0}, // Alt 00537 {KBDNLS_NOEVENT,0}, // Shift+Alt 00538 {KBDNLS_NOEVENT,0}, // Control+Alt 00539 {KBDNLS_NOEVENT,0} // Shift+Control+Alt 00540 } 00541 }, 00542 { 00543 VK_DBE_SBCSCHAR, // Base Vk 00544 KBDNLS_TYPE_NORMAL, // NLSFEProcType 00545 KBDNLS_INDEX_NORMAL, // NLSFEProcCurrent 00546 0x0, // NLSFEProcSwitch 00547 { // NLSFEProc 00548 {KBDNLS_SBCSDBCS,0}, // Base 00549 {KBDNLS_SBCSDBCS,0}, // Shift 00550 {KBDNLS_SBCSDBCS,0}, // Control 00551 {KBDNLS_SBCSDBCS,0}, // Shift+Control 00552 {KBDNLS_SEND_PARAM_VK,VK_KANJI}, // Alt 00553 {KBDNLS_SBCSDBCS,0}, // Shift+Alt 00554 {KBDNLS_SEND_PARAM_VK,VK_DBE_ENTERIMECONFIGMODE}, // Control+Alt 00555 {KBDNLS_SEND_PARAM_VK,VK_DBE_ENTERIMECONFIGMODE} // Shift+Control+Alt 00556 }, 00557 { // NLSFEProcIndexAlt 00558 {KBDNLS_NULL,0}, // Base 00559 {KBDNLS_NULL,0}, // Shift 00560 {KBDNLS_NULL,0}, // Control 00561 {KBDNLS_NULL,0}, // Shift+Control 00562 {KBDNLS_NULL,0}, // Alt 00563 {KBDNLS_NULL,0}, // Shift+Alt 00564 {KBDNLS_NULL,0}, // Control+Alt 00565 {KBDNLS_NULL,0} // Shift+Control+Alt 00566 } 00567 }, 00568 { 00569 VK_NONCONVERT, // Base Vk 00570 KBDNLS_TYPE_NORMAL, // NLSFEProcType 00571 KBDNLS_INDEX_NORMAL, // NLSFEProcCurrent 00572 0x0, // NLSFEProcSwitch 00573 { // NLSFEProc 00574 {KBDNLS_SEND_BASE_VK,0}, // Base 00575 {KBDNLS_SEND_BASE_VK,0}, // Shift 00576 {KBDNLS_SEND_BASE_VK,0}, // Control 00577 {KBDNLS_SEND_BASE_VK,0}, // Shift+Control 00578 {KBDNLS_SEND_BASE_VK,0}, // Alt 00579 {KBDNLS_SEND_BASE_VK,0}, // Shift+Alt 00580 {KBDNLS_SEND_PARAM_VK,VK_DBE_ENTERWORDREGISTERMODE}, // Control+Alt 00581 {KBDNLS_SEND_PARAM_VK,VK_DBE_ENTERWORDREGISTERMODE} // Shift+Control+Alt 00582 }, 00583 { // NLSFEProcIndexAlt 00584 {KBDNLS_NULL,0}, // Base 00585 {KBDNLS_NULL,0}, // Shift 00586 {KBDNLS_NULL,0}, // Control 00587 {KBDNLS_NULL,0}, // Shift+Control 00588 {KBDNLS_NULL,0}, // Alt 00589 {KBDNLS_NULL,0}, // Shift+Alt 00590 {KBDNLS_NULL,0}, // Control+Alt 00591 {KBDNLS_NULL,0} // Shift+Control+Alt 00592 } 00593 } 00594 }; 00595 00596 /***********************************************************************\ 00597 * KbdNlsTables 00598 * 00599 \***********************************************************************/ 00600 00601 static ALLOC_SECTION_LDATA KBDNLSTABLES KbdNlsTables = { 00602 0, // OEM ID (0 = Microsoft) 00603 0, // Information 00604 4, // Number of VK_F entry 00605 VkToFuncTable_106, // Pointer to VK_F array 00606 0, // Number of MouseVk entry 00607 NULL // Pointer to MouseVk array 00608 }; 00609 00610 static ALLOC_SECTION_LDATA KBDNLSTABLES KbdNlsTablesNEC98 = { 00611 0x0d, // OEM ID (0x0d = NEC) 00612 0, // Information 00613 4, // Number of VK_F entry 00614 VkToFuncTable_106, // Pointer to VK_F array 00615 0, // Number of MouseVk entry 00616 NULL // Pointer to MouseVk array 00617 }; 00618 00619 PKBDNLSTABLES KbdNlsLayerDescriptor(VOID) 00620 { 00621 if (!IsNEC_98) { 00622 return &KbdNlsTables; 00623 } else { 00624 return &KbdNlsTablesNEC98; 00625 } 00626 } 00627

Generated on Sat May 15 19:40:32 2004 for test by doxygen 1.3.7