📄 toascii.c
字号:
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) {
/////不同的输入判断。
switch(sImeL.dwRegImeIndex){
case INDEX_GB:
// return (GBProcessKey(wCharCode,lpImcP));
case INDEX_GBK:
// return (XGBProcessKey (wCharCode,lpImcP));
case INDEX_UNICODE:
// return(UnicodeProcessKey(wCharCode, lpImcP));
//if( IsUsedCode(wCharCode) )
//{
// return (CST_INPUT);
//}
return (GBProcessKey(wCharCode,lpImcP));
}
}
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;
}
//__asm int 3;
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 if(uVirtKey == CST_SHIFT) {
//__asm int 3;
//if( szAscii[0] == 0 )
//{
// DWORD fdwConversion;
// if( uCaps == 0 )
// {
// fdwConversion = (lpIMC->fdwConversion | IME_CMODE_NATIVE)&
// ~(IME_CMODE_CHARCODE | IME_CMODE_EUDC);
// uCaps = 1;
// } else {
// // change to native mode
// fdwConversion = lpIMC->fdwConversion & ~(IME_CMODE_CHARCODE |
// IME_CMODE_NATIVE | IME_CMODE_EUDC);
// uCaps = 0;
// }
// ImmSetConversionStatus(hIMC, fdwConversion, lpIMC->fdwSentence);
fRet = FALSE;
//}
}
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!
lpTransMsg->message = WM_CHAR;
lpTransMsg->wParam = (DWORD)wSymbolCharCode;
lpTransMsg->lParam = 1UL;
lpTransMsg++;
uRet++;
if(SymbolMode) {
lpTransMsg = lpTransBuf->TransMsg;
lpTransMsg->message = WM_CHAR;
lpTransMsg->wParam = (DWORD)wSymbolCharCode;
lpTransMsg->lParam = 1UL;
lpTransMsg++;
uRet++;
}
return (uRet); // generate two messages
}
/**********************************************************************/
/* TranslateFullChar() */
/* Return Value: */
/* the number of translated chars */
/**********************************************************************/
UINT PASCAL TranslateFullChar(
LPTRANSMSGLIST lpTransBuf,
WORD wCharCode)
{
// if your IME is possible to generate over ? messages,
// you need to take care about it
LPTRANSMSG lpTransMsg;
// wCharCode = sImeG.wFullABC[wCharCode - TEXT(' ')];
lpTransMsg = lpTransBuf->TransMsg;
// NT need to modify this!
lpTransMsg->message = WM_CHAR;
lpTransMsg->wParam = (DWORD)TEXT(' ');//wCharCode;
lpTransMsg->lParam = 1UL;
lpTransMsg++;
return (2); // generate two messages
}
/**********************************************************************/
/* TranslateToAscii() */
/* Return Value: */
/* the number of translated chars */
/**********************************************************************/
UINT PASCAL TranslateToAscii( // translate the key to WM_CHAR
// as keyboard driver
UINT uVirtKey,
UINT uScanCode,
LPTRANSMSGLIST lpTransBuf,
WORD wCharCode)
{
LPTRANSMSG lpTransMsg;
lpTransMsg = lpTransBuf->TransMsg;
if (wCharCode) { // one char code
lpTransMsg->message = WM_CHAR;
lpTransMsg->wParam = wCharCode;
lpTransMsg->lParam = (uScanCode << 16) | 1UL;
return (1);
}
// no char code case
return (0);
}
/**********************************************************************/
/* TranslateImeMessage() */
/* Return Value: */
/* the number of translated messages */
/**********************************************************************/
UINT PASCAL TranslateImeMessage(
LPTRANSMSGLIST lpTransBuf,
LPINPUTCONTEXT lpIMC,
LPPRIVCONTEXT lpImcP)
{
UINT uNumMsg;
UINT i;
BOOL bLockMsgBuf;
LPTRANSMSG lpTransMsg;
uNumMsg = 0;
bLockMsgBuf = FALSE;
for (i = 0; i < 2; i++) {
if (lpImcP->fdwImeMsg & MSG_CLOSE_CANDIDATE) {
if (lpImcP->fdwImeMsg & MSG_ALREADY_OPEN) {
if (!i) {
uNumMsg++;
} else {
lpTransMsg->message = WM_IME_NOTIFY;
lpTransMsg->wParam = IMN_CLOSECANDIDATE;
lpTransMsg->lParam = 0x0001;
lpTransMsg++;
lpImcP->fdwImeMsg &= ~(MSG_ALREADY_OPEN);
}
}
}
if (lpImcP->fdwImeMsg & MSG_END_COMPOSITION) {
if (lpImcP->fdwImeMsg & MSG_ALREADY_START) {
if (!i) {
uNumMsg++;
} else {
lpTransMsg->message = WM_IME_ENDCOMPOSITION;
lpTransMsg->wParam = 0;
lpTransMsg->lParam = 0;
lpTransMsg++;
lpImcP->fdwImeMsg &= ~(MSG_ALREADY_START);
}
}
}
if (lpImcP->fdwImeMsg & MSG_START_COMPOSITION) {
if (!(lpImcP->fdwImeMsg & MSG_ALREADY_START)) {
if (!i) {
uNumMsg++;
} else {
lpTransMsg->message = WM_IME_STARTCOMPOSITION;
lpTransMsg->wParam = 0;
lpTransMsg->lParam = 0;
lpTransMsg++;
lpImcP->fdwImeMsg |= MSG_ALREADY_START;
}
}
}
if (lpImcP->fdwImeMsg & MSG_IMN_COMPOSITIONPOS) {
if (!i) {
uNumMsg++;
} else {
lpTransMsg->message = WM_IME_NOTIFY;
lpTransMsg->wParam = IMN_SETCOMPOSITIONWINDOW;
lpTransMsg->lParam = 0;
lpTransMsg++;
}
}
if (lpImcP->fdwImeMsg & MSG_COMPOSITION) {
if (!i) {
uNumMsg++;
} else {
lpTransMsg->message = WM_IME_COMPOSITION;
lpTransMsg->wParam = (DWORD)lpImcP->dwCompChar;
lpTransMsg->lParam = (DWORD)lpImcP->fdwGcsFlag;
lpTransMsg++;
}
}
if (lpImcP->fdwImeMsg & MSG_GUIDELINE) {
if (!i) {
uNumMsg++;
} else {
lpTransMsg->message = WM_IME_NOTIFY;
lpTransMsg->wParam = IMN_GUIDELINE;
lpTransMsg->lParam = 0;
lpTransMsg++;
}
}
if (lpImcP->fdwImeMsg & MSG_OPEN_CANDIDATE) {
if (!(lpImcP->fdwImeMsg & MSG_ALREADY_OPEN)) {
if (!i) {
uNumMsg++;
} else {
lpTransMsg->message = WM_IME_NOTIFY;
lpTransMsg->wParam = IMN_OPENCANDIDATE;
lpTransMsg->lParam = 0x0001;
lpTransMsg++;
lpImcP->fdwImeMsg |= MSG_ALREADY_OPEN;
}
}
}
if (lpImcP->fdwImeMsg & MSG_CHANGE_CANDIDATE) {
if (!i) {
uNumMsg++;
} else {
lpTransMsg->message = WM_IME_NOTIFY;
lpTransMsg->wParam = IMN_CHANGECANDIDATE;
lpTransMsg->lParam = 0x0001;
lpTransMsg++;
}
}
if (lpImcP->fdwImeMsg & MSG_IMN_UPDATE_SOFTKBD) {
if (!i) {
uNumMsg++;
} else {
lpTransMsg->message = WM_IME_NOTIFY;
lpTransMsg->wParam = IMN_PRIVATE;
lpTransMsg->lParam = IMN_PRIVATE_UPDATE_SOFTKBD;
lpTransMsg++;
}
}
if (lpImcP->fdwImeMsg & MSG_IMN_UPDATE_STATUS) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -