📄 toascii.c
字号:
if (!lpIMC) {
return (CST_INVALID);
}
if (!lpImcP) {
return (CST_INVALID);
}
// filter system key (alt,alt+,ctrl,shift)
// and fOpen, IME_CMODE_NOCONVERSION
if (uVirtKey == VK_MENU) { // ALT key
return (CST_INVALID);
} else if (uScanCode & KF_ALTDOWN) { // ALT-xx key
return (CST_INVALID);
} else if (uVirtKey == VK_CONTROL) { // CTRL key
return (CST_INVALID);
} else if (uVirtKey == VK_SHIFT) { // SHIFT key
return (CST_INVALID);
} else if (!lpIMC->fOpen) { // don't compose in
// close status
return (CST_INVALID);
} else if (lpIMC->fdwConversion & IME_CMODE_NOCONVERSION) {
// Caps on/off
if(uVirtKey == VK_CAPITAL) {
return (CST_CAPITAL);
}else
return (CST_INVALID);
} else if (uVirtKey >= VK_NUMPAD0 && uVirtKey <= VK_DIVIDE) {
return (CST_INVALID);
} else {
}
// Caps on/off
if(uVirtKey == VK_CAPITAL) {
return (CST_CAPITAL);
}
if ((lpIMC->fdwConversion & IME_CMODE_SOFTKBD)
&& (lpImeL->dwSKWant != 0)){
if (wCharCode >= TEXT(' ') && wCharCode <= TEXT('~')) {
return (CST_SOFTKB);
} else {
return (CST_INVALID);
}
}
// candidate alaredy open, <,>,pageup,pagedown,?,ECS,key
if (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN) {
if (uVirtKey == VK_PRIOR) { // PageUp
return (CST_CHOOSE);
} else if (uVirtKey == VK_NEXT) { // PageDown
return (CST_CHOOSE);
} else if (wCharCode == TEXT('-')) {
return (CST_CHOOSE);
} else if (wCharCode == TEXT('=')) {
return (CST_CHOOSE);
} else if (uVirtKey == VK_HOME) {
return (CST_CHOOSE);
} else if (uVirtKey == VK_END) {
return (CST_CHOOSE);
} else if (uVirtKey == VK_ESCAPE) { // Esc
return (CST_CHOOSE);
} else if (wCharCode == TEXT(' ')) {
return (CST_CHOOSE);
} else {
}
}
// candidate alaredy open, shift + num key
if (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN) {
if ((wCharCode >= TEXT('0')) && wCharCode <= TEXT('9')) {
return (CST_CHOOSE);
}
}
// IME_CMODE_CHARCODE
if (lpIMC->fdwConversion & IME_CMODE_CHARCODE) { //Code Input Mode
return (CST_INVALID);
}
if (!(lpIMC->fdwConversion & IME_CMODE_NATIVE)) {
// alphanumeric mode
if (wCharCode >= TEXT(' ') && wCharCode <= TEXT('~')) {
return (CST_ALPHANUMERIC);
} else {
return (CST_INVALID);
}
} else if (wCharCode == TEXT('?')) {
} else if (wCharCode == TEXT(' ')) {
} else if(wCharCode >= TEXT(' ') && wCharCode <= TEXT('~')) {
if(!IsUsedCode(wCharCode)
&& lpImcP->iImeState != CST_INIT)
return (CST_INVALID_INPUT);
}
// Esc key
if (uVirtKey == VK_ESCAPE) {
register LPGUIDELINE lpGuideLine;
register UINT iImeState;
lpGuideLine = ImmLockIMCC(lpIMC->hGuideLine);
if(!lpGuideLine){
return (CST_INVALID);
}
if (lpImcP->fdwImeMsg & MSG_ALREADY_START) {
iImeState = CST_INPUT;
} else if (!lpGuideLine) {
iImeState = CST_INVALID;
} else if (lpGuideLine->dwLevel == GL_LEVEL_NOGUIDELINE) {
iImeState = CST_INVALID;
} else {
// need this key to clean information string or guideline state
iImeState = CST_INPUT;
}
ImmUnlockIMCC(lpIMC->hGuideLine);
return (iImeState);
}
// BackSpace Key
else if (uVirtKey == VK_BACK) {
if (lpImcP->fdwImeMsg & MSG_ALREADY_START) {
return (CST_INPUT);
} else {
return (CST_INVALID);
}
}
// NumPad key and Other Input vailid key
else if (uVirtKey >= VK_NUMPAD0 && uVirtKey <= VK_DIVIDE) {
return (CST_ALPHANUMERIC);
} else if (wCharCode > TEXT('~')) {
return (CST_INVALID);
} else if (wCharCode < TEXT(' ')) {
return (CST_INVALID);
} else if (lpIMC->fdwConversion & IME_CMODE_EUDC) {
}
else {
}
if (lpIMC->fdwConversion & IME_CMODE_NATIVE) {
// if (lpImcP->fdwGB & IME_SELECT_GB) {
#if defined(COMBO_IME)
switch(sImeL.dwRegImeIndex){
case INDEX_GB:
return (GBProcessKey(wCharCode,lpImcP));
case INDEX_GBK:
return (XGBProcessKey (wCharCode,lpImcP));
case INDEX_UNICODE:
return(UnicodeProcessKey(wCharCode, lpImcP));
}
#else //COMBO_IME
#ifdef GB
return (GBProcessKey(wCharCode,lpImcP));
// } else {
#else
return (XGBProcessKey (wCharCode,lpImcP));
// }
#endif //GB
#endif //COMBO_IME
}
return (CST_INVALID);
}
/**********************************************************************/
/* ImeProcessKey() */
/* Return Value: */
/* TRUE - successful, FALSE - failure */
/**********************************************************************/
BOOL WINAPI ImeProcessKey( // if this key is need by IME?
HIMC hIMC,
UINT uVirtKey,
LPARAM lParam,
CONST LPBYTE lpbKeyState)
{
LPINPUTCONTEXT lpIMC;
LPPRIVCONTEXT lpImcP;
BYTE szAscii[4];
int nChars;
int iRet;
BOOL fRet;
// can't compose in NULL hIMC
if (!hIMC) {
return (FALSE);
}
lpIMC = (LPINPUTCONTEXT)ImmLockIMC(hIMC);
if (!lpIMC) {
return (FALSE);
}
lpImcP = (LPPRIVCONTEXT)ImmLockIMCC(lpIMC->hPrivate);
if (!lpImcP) {
ImmUnlockIMC(hIMC);
return (FALSE);
}
nChars = ToAscii(uVirtKey, HIWORD(lParam), lpbKeyState,
(LPVOID)szAscii, 0);
if (!nChars) {
szAscii[0] = 0;
}
iRet = ProcessKey((WORD)szAscii[0], uVirtKey, HIWORD(lParam), lpbKeyState, lpIMC, lpImcP);
if(iRet == CST_INVALID) {
fRet = FALSE;
} else if((iRet == CST_INPUT) && (uVirtKey == TEXT('\b'))
&& (lpImcP->iImeState == CST_INIT)) {
lpImcP->fdwImeMsg = ((lpImcP->fdwImeMsg | MSG_END_COMPOSITION)
& ~(MSG_START_COMPOSITION)) & ~(MSG_IN_IMETOASCIIEX);
if (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN) {
ClearCand(lpIMC);
lpImcP->fdwImeMsg = (lpImcP->fdwImeMsg | MSG_CLOSE_CANDIDATE) &
~(MSG_OPEN_CANDIDATE);
}
GenerateMessage(hIMC, lpIMC, lpImcP);
fRet = FALSE;
} else if(uVirtKey == VK_CAPITAL) {
DWORD fdwConversion;
#ifdef LATER
if (lpbKeyState[VK_CAPITAL] & 0x01) {
// change to native mode
fdwConversion = (lpIMC->fdwConversion | IME_CMODE_NATIVE) &
~(IME_CMODE_CHARCODE | IME_CMODE_EUDC);
uCaps = 0;
} else {
// change to alphanumeric mode
fdwConversion = lpIMC->fdwConversion & ~(IME_CMODE_CHARCODE |
IME_CMODE_NATIVE | IME_CMODE_EUDC);
uCaps = 1;
}
#else
if (lpbKeyState[VK_CAPITAL] & 0x01) {
// change to alphanumeric mode
fdwConversion = lpIMC->fdwConversion & ~(IME_CMODE_CHARCODE |
IME_CMODE_NATIVE | IME_CMODE_EUDC);
uCaps = 1;
} else {
// change to native mode
fdwConversion = (lpIMC->fdwConversion | IME_CMODE_NATIVE)&
~(IME_CMODE_CHARCODE | IME_CMODE_EUDC);
uCaps = 0;
}
#endif //LATER
ImmSetConversionStatus(hIMC, fdwConversion, lpIMC->fdwSentence);
fRet = FALSE;
} else if((iRet == CST_ALPHANUMERIC)
&& !(lpIMC->fdwConversion & IME_CMODE_FULLSHAPE)
&& (uVirtKey == VK_SPACE)) {
fRet = FALSE;
} else {
fRet = TRUE;
}
ImmUnlockIMCC(lpIMC->hPrivate);
ImmUnlockIMC(hIMC);
return (fRet);
}
/**********************************************************************/
/* TranslateSymbolChar() */
/* Return Value: */
/* the number of translated chars */
/**********************************************************************/
UINT PASCAL TranslateSymbolChar(
LPTRANSMSGLIST lpTransBuf,
WORD wSymbolCharCode,
BOOL SymbolMode)
{
UINT uRet;
LPTRANSMSG lpTransMsg;
uRet = 0;
lpTransMsg = lpTransBuf->TransMsg;
// NT need to modify this!
#ifdef UNICODE
lpTransMsg->message = WM_CHAR;
lpTransMsg->wParam = (DWORD)wSymbolCharCode;
lpTransMsg->lParam = 1UL;
lpTransMsg++;
uRet++;
#else
lpTransMsg->message = WM_CHAR;
lpTransMsg->wParam = (DWORD)HIBYTE(wSymbolCharCode);
lpTransMsg->lParam = 1UL;
lpTransMsg++;
uRet++;
lpTransMsg->message = WM_CHAR;
lpTransMsg->wParam = (DWORD)LOBYTE(wSymbolCharCode);
lpTransMsg->lParam 1UL;
uRet++;
#endif
if(SymbolMode) {
lpTransMsg = lpTransBuf->TransMsg;
#ifdef UNICODE
lpTransMsg->message = WM_CHAR;
lpTransMsg->wParam = (DWORD)wSymbolCharCode;
lpTransMsg->lParam = 1UL;
lpTransMsg++;
uRet++;
#else
lpTransMsg->message = WM_CHAR;
lpTransMsg->wParam = (DWORD)HIBYTE(wSymbolCharCode);
lpTransMsg->lParam = 1UL;
lpTransMsg++;
uRet++;
lpTransMsg->message = WM_CHAR;
lpTransMsg->wParam = (DWORD)LOBYTE(wSymbolCharCode);
lpTransMsg->lParam = 1UL;
uRet++;
#endif
}
return (uRet); // generate two messages
}
/**********************************************************************/
/* TranslateFullChar() */
/* Return Value: */
/* the number of translated chars */
/**********************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -