- - (int)keyCodeForCharacter: (NSString*)character {
- if(![character length]) return -1;
- char code;
- BOOL shift, alt;
- if(Ascii2Virtual( (char)[character characterAtIndex: 0],shift,alt,code)) {
- return code;
- }
- return -1;
- }
- BOOL Ascii2Virtual(char pcar, BOOL *pshift, BOOL *palt, char *pkeycode)
- {
- KeyboardLayoutRef keyboard;
- const void *keyboardData; // keyboard layout data
- UInt16 nbblocs;
- char *modblocs, *blocs, *deadkeys;
- int ix, ifin, numbloc, keycode;
- BOOL shift, alt;
- // get the current keyboard
- if(KLGetCurrentKeyboardLayout(&keyboard;)) return NO;
- // get the description of the current keyboard layout
- if(KLGetKeyboardLayoutProperty(keyboard, kKLKCHRData, &keyboardData;)) return NO;
- // get pointer early numbers of blocks for each combination of modifiers
- modblocs = ((char *)keyboardData) + 2;
- // get number of blocks keycode->ascii
- nbblocs = *((UInt16 *)(keyboardData + 258));
- // get pointer early blocks keycode-> ascii
- blocs = ((char *)keyboardData) + 260;
- // determining the size of all tables keycode-> ascii a scanner
- ifin = nbblocs*128;
- // determining pointer early in the tables of dead keys
- deadkeys = blocs+ifin;
- // Now it runs blocks keycode-> ascii to find the car ascii
- for (ix=0; ix<ifin ;="" ix++)="" {="" if="" (blocs[ix]="=pcar)" found="" ascii="" value:="" now="" we="" must="" determine="" which="" block="" it="" is="" keycode="ix" &="" 0×7f;="" 0111="" 1111="" mask="" numbloc="ix">> 7;
- break;
- }
- }
- // not found: bail out (error)
- if (ix >= ifin) return NO;
- // from block number, we must find the combination of modifiers using this block
- for (ix=0; ix<15; ix++)
- {
- // it does not address whether the modifiers are not "capital" and "option"
- if (ix&1 || ix&4) continue;
- // Combining modifiers found for the block
- if (modblocs[ix]==numbloc)
- {
- shift = (ix&2) ? YES : NO;
- alt = (ix&8) ? YES : NO;
- break;
- }
- }
- // combination modifiers not found: bail
- if (ix>=15) return NO;
- // save our parameters
- *pkeycode=keycode;
- *pshift=shift;
- *palt=alt;
- return YES;
- }
- </ifin>
- //该片段来自于http://www.codesnippet.cn/detail/051220137810.html
来源: http://www.codesnippet.cn/detail/051220137810.html