📄 imm.c
字号:
TRANSMSG GnMsg;
int i = 0;
LPDWORD lpdw;
ImeLog(LOGF_API, TEXT("NotifyIME"));
switch(dwAction)
{
case NI_CONTEXTUPDATED:
switch (dwValue)
{
case IMC_SETOPENSTATUS:
lpIMC = ImmLockIMC(hIMC);
if (lpIMC)
{
if (!lpIMC->fOpen && IsCompStr(hIMC))
FlushText(hIMC);
ImmUnlockIMC(hIMC);
}
UpdateIndicIcon(hIMC);
bRet = TRUE;
break;
case IMC_SETCONVERSIONMODE:
break;
case IMC_SETCOMPOSITIONWINDOW:
break;
default:
break;
}
break;
case NI_COMPOSITIONSTR:
switch (dwIndex)
{
case CPS_COMPLETE:
MakeResultString(hIMC,TRUE);
bRet = TRUE;
break;
case CPS_CONVERT:
ConvHanja(hIMC,1, 0);
bRet = TRUE;
break;
case CPS_REVERT:
RevertText(hIMC);
bRet = TRUE;
break;
case CPS_CANCEL:
FlushText(hIMC);
bRet = TRUE;
break;
default:
break;
}
break;
case NI_OPENCANDIDATE:
if (IsConvertedCompStr(hIMC))
{
if (!(lpIMC = ImmLockIMC(hIMC)))
return FALSE;
if (!(lpCompStr = (LPCOMPOSITIONSTRING)ImmLockIMCC(lpIMC->hCompStr)))
{
ImmUnlockIMC(hIMC);
return FALSE;
}
if (lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo))
{
//
// Get the candidate strings from dic file.
//
nBufLen = GetCandidateStringsFromDictionary(GETLPCOMPREADSTR(lpCompStr),
(LPMYSTR)szBuf,256,
(LPTSTR)szDicFileName );
//
// generate WM_IME_NOTFIY IMN_OPENCANDIDATE message.
//
GnMsg.message = WM_IME_NOTIFY;
GnMsg.wParam = IMN_OPENCANDIDATE;
GnMsg.lParam = 1L;
GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
//
// Make candidate structures.
//
lpCandInfo->dwSize = sizeof(MYCAND);
lpCandInfo->dwCount = 1;
lpCandInfo->dwOffset[0] =
(DWORD)((LPSTR)&((LPMYCAND)lpCandInfo)->cl - (LPSTR)lpCandInfo);
lpCandList = (LPCANDIDATELIST)((LPSTR)lpCandInfo + lpCandInfo->dwOffset[0]);
lpdw = (LPDWORD)&(lpCandList->dwOffset);
lpstr = &szBuf[0];
while (*lpstr && (i < MAXCANDSTRNUM))
{
lpCandList->dwOffset[i] =
(DWORD)((LPSTR)((LPMYCAND)lpCandInfo)->szCand[i] - (LPSTR)lpCandList);
Mylstrcpy((LPMYSTR)((LPMYSTR)lpCandList+lpCandList->dwOffset[i]),lpstr);
lpstr += (Mylstrlen(lpstr) + 1);
i++;
}
lpCandList->dwSize = sizeof(CANDIDATELIST) +
(MAXCANDSTRNUM * (sizeof(DWORD) + MAXCANDSTRSIZE));
lpCandList->dwStyle = IME_CAND_READ;
lpCandList->dwCount = i;
lpCandList->dwPageStart = 0;
if (i < MAXCANDPAGESIZE)
lpCandList->dwPageSize = i;
else
lpCandList->dwPageSize = MAXCANDPAGESIZE;
lpCandList->dwSelection++;
if (lpCandList->dwSelection == (DWORD)i)
lpCandList->dwSelection = 0;
//
// Generate messages.
//
GnMsg.message = WM_IME_NOTIFY;
GnMsg.wParam = IMN_CHANGECANDIDATE;
GnMsg.lParam = 1L;
GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
ImmUnlockIMCC(lpIMC->hCandInfo);
ImmUnlockIMC(hIMC);
bRet = TRUE;
}
}
break;
case NI_CLOSECANDIDATE:
if (!(lpIMC = ImmLockIMC(hIMC)))
return FALSE;
if (IsCandidate(lpIMC))
{
GnMsg.message = WM_IME_NOTIFY;
GnMsg.wParam = IMN_CLOSECANDIDATE;
GnMsg.lParam = 1L;
GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
bRet = TRUE;
}
ImmUnlockIMC(hIMC);
break;
case NI_SELECTCANDIDATESTR:
if (!(lpIMC = ImmLockIMC(hIMC)))
return FALSE;
if (dwIndex == 1 && IsCandidate(lpIMC))
{
if (lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo))
{
lpCandList = (LPCANDIDATELIST)((LPSTR)lpCandInfo + lpCandInfo->dwOffset[0]);
if (lpCandList->dwCount > dwValue)
{
lpCandList->dwSelection = dwValue;
bRet = TRUE;
//
// Generate messages.
//
GnMsg.message = WM_IME_NOTIFY;
GnMsg.wParam = IMN_CHANGECANDIDATE;
GnMsg.lParam = 1L;
GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
}
ImmUnlockIMCC(lpIMC->hCandInfo);
}
}
ImmUnlockIMC(hIMC);
break;
case NI_CHANGECANDIDATELIST:
if (!(lpIMC = ImmLockIMC(hIMC)))
return FALSE;
if (dwIndex == 1 && IsCandidate(lpIMC))
bRet = TRUE;
ImmUnlockIMC(hIMC);
break;
case NI_SETCANDIDATE_PAGESIZE:
if (!(lpIMC = ImmLockIMC(hIMC)))
return FALSE;
if (dwIndex == 1 && IsCandidate(lpIMC))
{
if (dwValue > MAXCANDPAGESIZE)
return FALSE;
if (lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo))
{
lpCandList = (LPCANDIDATELIST)((LPSTR)lpCandInfo + lpCandInfo->dwOffset[0]);
if (lpCandList->dwCount > dwValue)
{
lpCandList->dwPageSize = dwValue;
bRet = TRUE;
//
// Generate messages.
//
GnMsg.message = WM_IME_NOTIFY;
GnMsg.wParam = IMN_CHANGECANDIDATE;
GnMsg.lParam = 1L;
GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
}
ImmUnlockIMCC(lpIMC->hCandInfo);
}
}
ImmUnlockIMC(hIMC);
break;
case NI_SETCANDIDATE_PAGESTART:
if (!(lpIMC = ImmLockIMC(hIMC)))
return FALSE;
if (dwIndex == 1 && IsCandidate(lpIMC))
{
if (dwValue > MAXCANDPAGESIZE)
return FALSE;
if (lpCandInfo = (LPCANDIDATEINFO)ImmLockIMCC(lpIMC->hCandInfo))
{
lpCandList = (LPCANDIDATELIST)((LPSTR)lpCandInfo + lpCandInfo->dwOffset[0]);
if (lpCandList->dwCount > dwValue)
{
lpCandList->dwPageStart = dwValue;
bRet = TRUE;
//
// Generate messages.
//
GnMsg.message = WM_IME_NOTIFY;
GnMsg.wParam = IMN_CHANGECANDIDATE;
GnMsg.lParam = 1L;
GenerateMessage(hIMC, lpIMC, lpCurTransKey,(LPTRANSMSG)&GnMsg);
}
ImmUnlockIMCC(lpIMC->hCandInfo);
}
}
ImmUnlockIMC(hIMC);
break;
case NI_IMEMENUSELECTED:
#ifdef DEBUG
{
TCHAR szDev[80];
OutputDebugString((LPTSTR)TEXT("NotifyIME IMEMENUSELECTED\r\n"));
wsprintf((LPTSTR)szDev,TEXT("\thIMC is 0x%x\r\n"),hIMC);
OutputDebugString((LPTSTR)szDev);
wsprintf((LPTSTR)szDev,TEXT("\tdwIndex is 0x%x\r\n"),dwIndex);
OutputDebugString((LPTSTR)szDev);
wsprintf((LPTSTR)szDev,TEXT("\tdwValue is 0x%x\r\n"),dwValue);
OutputDebugString((LPTSTR)szDev);
}
#endif
break;
default:
break;
}
return bRet;
}
/**********************************************************************/
/* ImeSelect() */
/* */
/**********************************************************************/
BOOL WINAPI ImeSelect(HIMC hIMC, BOOL fSelect)
{
LPINPUTCONTEXT lpIMC;
ImeLog(LOGF_ENTRY | LOGF_API, TEXT("ImeSelect"));
if (fSelect)
UpdateIndicIcon(hIMC);
// it's NULL context.
if (!hIMC)
return TRUE;
if (lpIMC = ImmLockIMC(hIMC))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -