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

kbd103.c

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

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