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

imehotky.c File Reference

#include "precomp.h"

Go to the source code of this file.

Defines

#define L_CHS   MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED)
#define L_JPN   MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT)
#define L_KOR   MAKELANGID(LANG_KOREAN, SUBLANG_DEFAULT)
#define L_CHT   MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL)

Enumerations

enum  { ILANG_NO_MATCH = 0, ILANG_MATCH_SYSTEM, ILANG_MATCH_THREAD, ILANG_MATCH_PERFECT }

Functions

PIMEHOTKEYOBJ DeleteImeHotKey (PIMEHOTKEYOBJ *ppHead, PIMEHOTKEYOBJ pDelete)
VOID AddImeHotKey (PIMEHOTKEYOBJ *ppHead, PIMEHOTKEYOBJ pAdd)
PIMEHOTKEYOBJ FindImeHotKeyByKey (PIMEHOTKEYOBJ pHead, UINT uModifyKeys, UINT uRL, UINT uVKey)
PIMEHOTKEYOBJ FindImeHotKeyByID (PIMEHOTKEYOBJ pHead, DWORD dwHotKeyID)
PIMEHOTKEYOBJ FindImeHotKeyByKeyWithLang (PIMEHOTKEYOBJ pHead, UINT uModifyKeys, UINT uRL, UINT uVKey, LANGID langId)
LANGID GetHotKeyLangID (DWORD dwHotKeyID)
BOOL GetImeHotKey (DWORD dwHotKeyID, PUINT puModifiers, PUINT puVKey, HKL *phKL)
BOOL SetImeHotKey (DWORD dwHotKeyID, UINT uModifiers, UINT uVKey, HKL hKL, DWORD dwAction)
VOID FreeImeHotKeys (VOID)
int GetLangIdMatchLevel (HKL hkl, LANGID langId)
PIMEHOTKEYOBJ CheckImeHotKey (PQ pq, UINT uVKey, LPARAM lParam)

Variables

LCID glcidSystem


Define Documentation

#define L_CHS   MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED)
 

Definition at line 28 of file imehotky.c.

Referenced by GetHotKeyLangID().

#define L_CHT   MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_TRADITIONAL)
 

Definition at line 31 of file imehotky.c.

Referenced by GetHotKeyLangID().

#define L_JPN   MAKELANGID(LANG_JAPANESE, SUBLANG_DEFAULT)
 

Definition at line 29 of file imehotky.c.

Referenced by GetHotKeyLangID().

#define L_KOR   MAKELANGID(LANG_KOREAN, SUBLANG_DEFAULT)
 

Definition at line 30 of file imehotky.c.

Referenced by GetHotKeyLangID().


Enumeration Type Documentation

anonymous enum
 

Enumeration values:
ILANG_NO_MATCH 
ILANG_MATCH_SYSTEM 
ILANG_MATCH_THREAD 
ILANG_MATCH_PERFECT 

Definition at line 33 of file imehotky.c.

00033 { 00034 ILANG_NO_MATCH = 0, // 0: does not match. 00035 ILANG_MATCH_SYSTEM, // 1: matches the system locale 00036 ILANG_MATCH_THREAD, // 2: matches the thread locale 00037 ILANG_MATCH_PERFECT, // 3: matches the current HKL, or direct KL switching hotkey. 00038 };


Function Documentation

VOID AddImeHotKey PIMEHOTKEYOBJ ppHead,
PIMEHOTKEYOBJ  pAdd
 

Definition at line 237 of file imehotky.c.

References NULL, _tagIMEHOTKEYOBJ::pNext, and VOID().

Referenced by SetImeHotKey().

00238 { 00239 PIMEHOTKEYOBJ ph; 00240 00241 if ( *ppHead == NULL ) { 00242 *ppHead = pAdd; 00243 } else { 00244 ph = *ppHead; 00245 while( ph->pNext != NULL ) 00246 ph = ph->pNext; 00247 ph->pNext = pAdd; 00248 } 00249 return; 00250 }

PIMEHOTKEYOBJ CheckImeHotKey PQ  pq,
UINT  uVKey,
LPARAM  lParam
 

Definition at line 461 of file imehotky.c.

References BOOL, FALSE, FindImeHotKeyByKey(), gpImeHotKeyListHeader, _tagIMEHOTKEYOBJ::hk, MOD_BOTH_SIDES, MOD_MODIFY_KEYS, NULL, TestKeyStateDown, TRUE, UINT, and _tagIMEHOTKEY::uModifiers.

Referenced by NtUserCheckImeHotKey(), and xxxImmProcessKey().

00466 { 00467 static UINT uVKeySaved = 0; 00468 PIMEHOTKEYOBJ ph; 00469 UINT uModifiers = 0; 00470 BOOL fKeyUp; 00471 00472 // 00473 // early return for key up message 00474 // 00475 fKeyUp = ( lParam & 0x80000000 ) ? TRUE : FALSE; 00476 if ( fKeyUp ) { 00477 // 00478 // if the uVKey is not same as the vkey 00479 // we previously saved, there is no chance 00480 // that this is a hotkey. 00481 // 00482 if ( uVKeySaved != uVKey ) { 00483 uVKeySaved = 0; 00484 return NULL; 00485 } 00486 uVKeySaved = 0; 00487 // 00488 // If it's same, we still need to check 00489 // the hotkey list because there is a 00490 // chance that the hotkey list is modified 00491 // between the key make and break. 00492 // 00493 } 00494 00495 // 00496 // Current specification doesn't allow us to use a complex 00497 // hotkey such as LSHIFT+RMENU+SPACE 00498 // 00499 00500 // 00501 // Setup the shift, control, alt key states 00502 // 00503 uModifiers |= TestKeyStateDown(pq, VK_LSHIFT) ? (MOD_SHIFT | MOD_LEFT) : 0; 00504 uModifiers |= TestKeyStateDown(pq, VK_RSHIFT) ? (MOD_SHIFT | MOD_RIGHT) : 0; 00505 00506 uModifiers |= TestKeyStateDown(pq, VK_LCONTROL) ? (MOD_CONTROL | MOD_LEFT) : 0; 00507 uModifiers |= TestKeyStateDown(pq, VK_RCONTROL) ? (MOD_CONTROL | MOD_RIGHT) : 0; 00508 00509 uModifiers |= TestKeyStateDown(pq, VK_LMENU) ? (MOD_ALT | MOD_LEFT) : 0; 00510 uModifiers |= TestKeyStateDown(pq, VK_RMENU) ? (MOD_ALT | MOD_RIGHT) : 0; 00511 00512 ph = FindImeHotKeyByKey( gpImeHotKeyListHeader, 00513 uModifiers & MOD_MODIFY_KEYS, 00514 uModifiers & MOD_BOTH_SIDES, 00515 uVKey ); 00516 00517 if ( ph != NULL ) { 00518 if ( fKeyUp ) { 00519 if ( ph->hk.uModifiers & MOD_ON_KEYUP ) { 00520 return ph; 00521 } 00522 } else { 00523 if ( ph->hk.uModifiers & MOD_ON_KEYUP ) { 00524 // 00525 // save vkey for next keyup message time 00526 // 00527 // when ALT+Z is a hotkey, we don't want 00528 // to handle #2 as the hotkey sequence. 00529 // 1) ALT make -> 'Z' make -> 'Z' break 00530 // 2) 'Z' make -> ALT make -> 'Z' break 00531 // 00532 uVKeySaved = uVKey; 00533 } else { 00534 return ph; 00535 } 00536 } 00537 } 00538 00539 return NULL; 00540 }

PIMEHOTKEYOBJ DeleteImeHotKey PIMEHOTKEYOBJ ppHead,
PIMEHOTKEYOBJ  pDelete
 

Definition at line 219 of file imehotky.c.

References NULL, and _tagIMEHOTKEYOBJ::pNext.

Referenced by SetImeHotKey().

00220 { 00221 PIMEHOTKEYOBJ ph; 00222 00223 if ( pDelete == *ppHead ) { 00224 *ppHead = pDelete->pNext; 00225 return pDelete; 00226 } 00227 00228 for ( ph = *ppHead; ph != NULL; ph = ph->pNext ) { 00229 if ( ph->pNext == pDelete ) { 00230 ph->pNext = pDelete->pNext; 00231 return pDelete; 00232 } 00233 } 00234 return NULL; 00235 }

PIMEHOTKEYOBJ FindImeHotKeyByID PIMEHOTKEYOBJ  pHead,
DWORD  dwHotKeyID
 

Definition at line 404 of file imehotky.c.

References _tagIMEHOTKEY::dwHotKeyID, _tagIMEHOTKEYOBJ::hk, NULL, and _tagIMEHOTKEYOBJ::pNext.

Referenced by GetImeHotKey(), and SetImeHotKey().

00405 { 00406 PIMEHOTKEYOBJ ph; 00407 00408 for ( ph = pHead; ph != NULL; ph = ph->pNext ) { 00409 if ( ph->hk.dwHotKeyID == dwHotKeyID ) 00410 return (ph); 00411 } 00412 return (PIMEHOTKEYOBJ)NULL; 00413 }

PIMEHOTKEYOBJ FindImeHotKeyByKey PIMEHOTKEYOBJ  pHead,
UINT  uModifyKeys,
UINT  uRL,
UINT  uVKey
 

Definition at line 315 of file imehotky.c.

References BOOL, DbgPrint, _tagIMEHOTKEY::dwHotKeyID, FALSE, GetActiveHKL(), GetHotKeyLangID(), GetLangIdMatchLevel(), _tagIMEHOTKEYOBJ::hk, tagTHREADINFO::hklPrev, ILANG_MATCH_PERFECT, ILANG_NO_MATCH, MOD_BOTH_SIDES, MOD_MODIFY_KEYS, NULL, _tagIMEHOTKEYOBJ::pNext, PtiCurrent, TRUE, _tagIMEHOTKEY::uModifiers, and _tagIMEHOTKEY::uVKey.

Referenced by CheckImeHotKey().

00320 { 00321 PTHREADINFO ptiCurrent = PtiCurrent(); 00322 PIMEHOTKEYOBJ phResult = NULL; 00323 PIMEHOTKEYOBJ ph; 00324 HKL hkl = GetActiveHKL(); 00325 WORD langPrimary = PRIMARYLANGID(LOWORD(HandleToUlong(hkl))); 00326 int iLevel = ILANG_NO_MATCH; 00327 00328 for (ph = pHead; ph != NULL; ph = ph->pNext) { 00329 00330 if (ph->hk.uVKey == uVKey) { 00331 BOOL fDoCheck = FALSE; 00332 00333 // Check if the modifiers match 00334 if ((ph->hk.uModifiers & MOD_IGNORE_ALL_MODIFIER)) { 00335 fDoCheck = TRUE; 00336 } else if ((ph->hk.uModifiers & MOD_MODIFY_KEYS) != uModifyKeys) { 00337 continue; 00338 } 00339 00340 if ((ph->hk.uModifiers & MOD_BOTH_SIDES) == uRL || 00341 (ph->hk.uModifiers & MOD_BOTH_SIDES) & uRL) { 00342 fDoCheck = TRUE; 00343 } 00344 00345 if (fDoCheck) { 00346 LANGID langId = GetHotKeyLangID(ph->hk.dwHotKeyID); 00347 int iMatch = GetLangIdMatchLevel(hkl, langId); 00348 00349 #if 0 // Test only 00350 if (iMatch != ILANG_NO_MATCH) { 00351 DbgPrint("GetIdMatchLevel(%X, %X)=%d\n", hkl, langId); 00352 } 00353 #endif 00354 00355 if (iMatch == ILANG_MATCH_PERFECT) { 00356 // Perfect match ! 00357 return ph; 00358 } 00359 00360 // If the hotkey is DSWITCH, GetLangIdMatchLevel() must return 3. 00361 UserAssert(ph->hk.dwHotKeyID < IME_HOTKEY_DSWITCH_FIRST || 00362 ph->hk.dwHotKeyID > IME_HOTKEY_DSWITCH_LAST); 00363 00364 if (langPrimary == LANG_KOREAN) { 00365 // Korean IME wants no hotkeys except the direct 00366 // keyboard layout switching hotkeys. 00367 continue; 00368 } 00369 00370 if (iMatch == ILANG_NO_MATCH) { 00371 // Special case for CHT/CHS toggle 00372 if (ph->hk.dwHotKeyID == IME_CHOTKEY_IME_NONIME_TOGGLE || 00373 ph->hk.dwHotKeyID == IME_THOTKEY_IME_NONIME_TOGGLE) { 00374 // 00375 // If the key is for CHT/CHS toggle and the previous 00376 // hkl is either CHT/CHS, it is a IME hotkey. 00377 // 00378 if (LOWORD(HandleToUlong(ptiCurrent->hklPrev)) == langId) { 00379 #if 0 // Test only 00380 DbgPrint("FindImeHotKeyByKey() found CHT/CHS hotkey.\n"); 00381 #endif 00382 return ph; 00383 } 00384 } 00385 } 00386 else if (iMatch > iLevel) { 00387 // Current ph is the strongest candidate so far. 00388 iLevel = iMatch; 00389 phResult = ph; 00390 } 00391 } 00392 } 00393 } 00394 00395 return phResult; 00396 }

PIMEHOTKEYOBJ FindImeHotKeyByKeyWithLang PIMEHOTKEYOBJ  pHead,
UINT  uModifyKeys,
UINT  uRL,
UINT  uVKey,
LANGID  langId
 

Definition at line 421 of file imehotky.c.

References BOOL, _tagIMEHOTKEY::dwHotKeyID, FALSE, GetHotKeyLangID(), _tagIMEHOTKEYOBJ::hk, MOD_BOTH_SIDES, MOD_MODIFY_KEYS, NULL, _tagIMEHOTKEYOBJ::pNext, TRUE, _tagIMEHOTKEY::uModifiers, and _tagIMEHOTKEY::uVKey.

Referenced by SetImeHotKey().

00427 { 00428 PIMEHOTKEYOBJ ph; 00429 00430 for (ph = pHead; ph != NULL; ph = ph->pNext) { 00431 00432 if (ph->hk.uVKey == uVKey) { 00433 BOOL fDoCheck = FALSE; 00434 00435 // Check if the modifiers match 00436 if ((ph->hk.uModifiers & MOD_IGNORE_ALL_MODIFIER)) { 00437 fDoCheck = TRUE; 00438 } else if ((ph->hk.uModifiers & MOD_MODIFY_KEYS) != uModifyKeys) { 00439 continue; 00440 } 00441 00442 if ((ph->hk.uModifiers & MOD_BOTH_SIDES) == uRL || 00443 (ph->hk.uModifiers & MOD_BOTH_SIDES) & uRL) { 00444 fDoCheck = TRUE; 00445 } 00446 00447 if (fDoCheck) { 00448 LANGID langId = GetHotKeyLangID(ph->hk.dwHotKeyID); 00449 00450 if (langIdKey == langId || langId == LANG_NEUTRAL) { 00451 return ph; 00452 } 00453 } 00454 } 00455 } 00456 00457 return NULL; 00458 }

VOID FreeImeHotKeys VOID   ) 
 

Definition at line 252 of file imehotky.c.

References gpImeHotKeyListHeader, NULL, _tagIMEHOTKEYOBJ::pNext, and VOID().

Referenced by Win32kNtUserCleanup().

00253 { 00254 PIMEHOTKEYOBJ phk; 00255 00256 while (gpImeHotKeyListHeader != NULL) { 00257 phk = gpImeHotKeyListHeader->pNext; 00258 UserFreePool(gpImeHotKeyListHeader); 00259 gpImeHotKeyListHeader = phk; 00260 } 00261 }

LANGID GetHotKeyLangID DWORD  dwHotKeyID  ) 
 

Definition at line 46 of file imehotky.c.

References L_CHS, L_CHT, L_JPN, and L_KOR.

Referenced by FindImeHotKeyByKey(), FindImeHotKeyByKeyWithLang(), and SetImeHotKey().

00047 { 00048 LANGID langId = -1; 00049 static CONST LANGID aLangId[] = { 00050 ~0, // 0x00 - 0x0f: illegal 00051 L_CHS, L_CHS, // 0x10 - 0x2f 00052 L_JPN, L_JPN, // 0x30 - 0x4f 00053 L_KOR, L_KOR, // 0x50 - 0x6f 00054 L_CHT, L_CHT, // 0x70 - 0x8f 00055 }; 00056 00057 if (dwHotKeyID >= IME_CHOTKEY_FIRST && dwHotKeyID <= IME_THOTKEY_LAST) { 00058 langId = aLangId[dwHotKeyID >> 4]; 00059 } 00060 else { 00061 langId = LANG_NEUTRAL; 00062 } 00063 00064 // Because KOR IME does not want IME hot key handling 00065 UserAssert(langId != L_KOR); 00066 00067 return langId; 00068 }

BOOL GetImeHotKey DWORD  dwHotKeyID,
PUINT  puModifiers,
PUINT  puVKey,
HKL *  phKL
 

Definition at line 71 of file imehotky.c.

References FALSE, FindImeHotKeyByID(), gpImeHotKeyListHeader, _tagIMEHOTKEYOBJ::hk, _tagIMEHOTKEY::hKL, NULL, TRUE, _tagIMEHOTKEY::uModifiers, and _tagIMEHOTKEY::uVKey.

Referenced by NtUserGetImeHotKey().

00076 { 00077 PIMEHOTKEYOBJ ph; 00078 00079 ph = FindImeHotKeyByID( gpImeHotKeyListHeader, dwHotKeyID ); 00080 if ( ph == NULL ) { 00081 RIPERR0(ERROR_HOTKEY_NOT_REGISTERED, RIP_VERBOSE, "No such IME hotkey"); 00082 return (FALSE); 00083 } 00084 00085 // 00086 // it is OK for NULL phKL, if the target hKL is NULL 00087 // 00088 if ( phKL ) { 00089 *phKL = ph->hk.hKL; 00090 } else if ( ph->hk.hKL != NULL ) { 00091 RIPERR0(ERROR_INVALID_PARAMETER, RIP_WARNING, "phKL is null"); 00092 return (FALSE); 00093 } 00094 00095 *puModifiers = ph->hk.uModifiers; 00096 *puVKey = ph->hk.uVKey; 00097 00098 return (TRUE); 00099 }

int GetLangIdMatchLevel HKL  hkl,
LANGID  langId
 

Definition at line 266 of file imehotky.c.

References FALSE, glcidSystem, ILANG_MATCH_PERFECT, ILANG_MATCH_SYSTEM, ILANG_MATCH_THREAD, and ILANG_NO_MATCH.

Referenced by FindImeHotKeyByKey().

00267 { 00268 00269 if (langId == LANG_NEUTRAL) { 00270 // 00271 // If langId is LANG_NEUTRAL, the hot key does not depend on 00272 // the current HKL. Make it perfect match always. 00273 // 00274 return ILANG_MATCH_PERFECT; 00275 } 00276 00277 { 00278 LCID lcid; 00279 00280 if (LOWORD(HandleToUlong(hkl)) == langId) { 00281 // langId matches the current KL locale 00282 return ILANG_MATCH_PERFECT; 00283 } 00284 00285 lcid = NtCurrentTeb()->CurrentLocale; 00286 if (LANGIDFROMLCID(lcid) == langId) { 00287 // langId matches the current thread's locale 00288 return ILANG_MATCH_THREAD; 00289 } 00290 00291 if (glcidSystem == 0) { 00292 // If we've not got system default locale yet, get it here. 00293 ZwQueryDefaultLocale(FALSE, &glcidSystem); 00294 } 00295 if (LANGIDFROMLCID(glcidSystem) == langId) { 00296 // langId matches the system locale. 00297 return ILANG_MATCH_SYSTEM; 00298 } 00299 } 00300 00301 return ILANG_NO_MATCH; 00302 }

BOOL SetImeHotKey DWORD  dwHotKeyID,
UINT  uModifiers,
UINT  uVKey,
HKL  hKL,
DWORD  dwAction
 

Definition at line 106 of file imehotky.c.

References AddImeHotKey(), DeleteImeHotKey(), _tagIMEHOTKEY::dwHotKeyID, FALSE, FindImeHotKeyByID(), FindImeHotKeyByKeyWithLang(), GetHotKeyLangID(), gpImeHotKeyListHeader, _tagIMEHOTKEYOBJ::hk, _tagIMEHOTKEY::hKL, IMEHOTKEYOBJ, ISHK_ADD, ISHK_INITIALIZE, ISHK_REMOVE, MOD_BOTH_SIDES, MOD_MODIFY_KEYS, NULL, _tagIMEHOTKEYOBJ::pNext, TRUE, _tagIMEHOTKEY::uModifiers, and _tagIMEHOTKEY::uVKey.

Referenced by NtUserSetImeHotKey().

00112 { 00113 PIMEHOTKEYOBJ ph; 00114 00115 switch ( dwAction ) { 00116 case ISHK_REMOVE: 00117 ph = FindImeHotKeyByID( gpImeHotKeyListHeader, dwHotKeyID ); 00118 if ( ph != NULL ) { 00119 if ( DeleteImeHotKey( &gpImeHotKeyListHeader, ph ) == ph ) { 00120 UserFreePool( ph ); 00121 return ( TRUE ); 00122 } else { 00123 RIPMSG0( RIP_ERROR, "IME hotkey list is messed up" ); 00124 return FALSE; 00125 } 00126 } else { 00127 RIPERR0( ERROR_INVALID_PARAMETER, 00128 RIP_WARNING, 00129 "no such IME hotkey registered"); 00130 return FALSE; 00131 } 00132 break; 00133 00134 case ISHK_INITIALIZE: 00135 ph = gpImeHotKeyListHeader; 00136 while ( ph != NULL ) { 00137 PIMEHOTKEYOBJ phNext; 00138 00139 phNext = ph->pNext; 00140 UserFreePool( ph ); 00141 ph = phNext; 00142 } 00143 gpImeHotKeyListHeader = NULL; 00144 return TRUE; 00145 00146 case ISHK_ADD: 00147 if (dwHotKeyID >= IME_KHOTKEY_FIRST && dwHotKeyID <= IME_KHOTKEY_LAST) { 00148 // Korean IME does not want any IMM hotkey handling. 00149 // We should not register any Korean IME hot keys. 00150 return FALSE; 00151 } 00152 00153 if ((WORD)uVKey == VK_PACKET) { 00154 // 00155 // VK_PACKET should not be a IME hot key. 00156 // 00157 return FALSE; 00158 } 00159 00160 ph = FindImeHotKeyByKeyWithLang(gpImeHotKeyListHeader, 00161 uModifiers & MOD_MODIFY_KEYS, 00162 uModifiers & MOD_BOTH_SIDES, 00163 uVKey, 00164 GetHotKeyLangID(dwHotKeyID)); 00165 if ( ph != NULL ) { 00166 if ( ph->hk.dwHotKeyID != dwHotKeyID ) { 00167 RIPERR0( ERROR_HOTKEY_ALREADY_REGISTERED, 00168 RIP_WARNING, 00169 "There is an IME hotkey that has the same vkey/modifiers/Lang Id"); 00170 return FALSE; 00171 } 00172 // So far we found a hotkey that has the 00173 // same vkey and same ID. 00174 // But because modifiers may be slightly 00175 // different, so go ahead and change it. 00176 } else { 00177 // 00178 // the specified vkey/modifiers combination cound not be found 00179 // in the hotkey list. The caller may want to change the key 00180 // assignment of an existing hotkey or add a new hotkey. 00181 // 00182 ph = FindImeHotKeyByID( gpImeHotKeyListHeader, dwHotKeyID ); 00183 } 00184 00185 if ( ph == NULL ) { 00186 // 00187 // adding a new hotkey 00188 // 00189 ph = (PIMEHOTKEYOBJ)UserAllocPool( sizeof(IMEHOTKEYOBJ), TAG_IMEHOTKEY ); 00190 if ( ph == NULL ) { 00191 RIPERR0( ERROR_OUTOFMEMORY, 00192 RIP_WARNING, 00193 "Memory allocation failed in SetImeHotKey"); 00194 return FALSE; 00195 } 00196 ph->hk.dwHotKeyID = dwHotKeyID; 00197 ph->hk.uModifiers = uModifiers; 00198 ph->hk.uVKey = uVKey; 00199 ph->hk.hKL = hKL; 00200 ph->pNext = NULL; 00201 AddImeHotKey( &gpImeHotKeyListHeader, ph ); 00202 00203 } else { 00204 // 00205 // changing an existing hotkey 00206 // 00207 ph->hk.uModifiers = uModifiers; 00208 ph->hk.uVKey = uVKey; 00209 ph->hk.hKL = hKL; 00210 00211 } 00212 return TRUE; 00213 } 00214 00215 return FALSE; 00216 }


Variable Documentation

LCID glcidSystem
 

Definition at line 264 of file imehotky.c.

Referenced by GetLangIdMatchLevel().


Generated on Sat May 15 19:44:09 2004 for test by doxygen 1.3.7