输入法编程——获取候选项

这段代码展示了如何在Windows中编程获取输入法的候选项列表。通过WM_IME_NOTIFY消息处理,当输入法打开候选窗口或者改变候选时,获取并显示候选项。当候选窗口关闭时,恢复默认提示文本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

WNDPROC s_pOldProc = NULL;

LRESULT CALLBACK CImeFilterDlg::SubProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
 switch (Msg)
 {
 case  WM_IME_NOTIFY:
  if(wParam==IMN_OPENCANDIDATE || wParam==IMN_CHANGECANDIDATE )
  {
   HIMC hIMC = ::ImmGetContext(hWnd);

   if(hIMC != NULL)
   {
    DWORD dwSize = 0;
    ::ImmGetCandidateListCount(hIMC, &dwSize);

    for(UINT32 i=0; i<dwSize; ++i)
    {
     if((dwSize=::ImmGetCandidateList(hIMC, i, NULL, 0)) > 0)
     {
      LPCANDIDATELIST lpList = (LPCANDIDATELIST)new CHAR[dwSize];
      if (lpList == NULL)
      {
       continue;
      }

      lpList->dwSize = sizeof(CANDIDATELIST);
      dwSize = ::ImmGetCandidateList(hIMC, i, lpList, dwSize);

      if(lpList->dwCount > 0)
      {
       DWORD dwStart = lpList->dwPageStart;
       DWORD dwEnd = lpList->dwPageStart+lpList->dwPageSize > lpList->dwCount
        ? lpList->dwCount : lpList->dwPageStart+lpList->dwPageSize;
       CString data = (CString)(LPCWSTR)((PBYTE)lpList + lpList->dwOffset[dwStart]);

       for (UINT32 j = dwStart+1; j< dwEnd; j++)
       {
        LPCWSTR lpszString = (LPCWSTR)((PBYTE)lpList + lpList->dwOffset[j]);
        data += TEXT(" ");
        data += (CString)lpszString;
       }

       ((CImeFilterDlg *)AfxGetMainWnd())->SetDlgItemText(IDC_LBLCANDIDATE, data);
       data = (CString)(LPCWSTR)((PBYTE)lpList + lpList->dwOffset[lpList->dwSelection]);
       ((CImeFilterDlg *)AfxGetMainWnd())->SetDlgItemText(IDC_LBLCURCAND, data);
      }

      delete []lpList;
     }
    }

    ::ImmReleaseContext(hWnd, hIMC);
   }
  }
  else if(wParam == IMN_CLOSECANDIDATE)
  {
   ((CImeFilterDlg *)AfxGetMainWnd())->SetDlgItemText(IDC_LBLCANDIDATE, TEXT("输入法候选项..."));
   ((CImeFilterDlg *)AfxGetMainWnd())->SetDlgItemText(IDC_LBLCURCAND, TEXT("当前候选项..."));
  }

  break;
 default:
  break;
 }

 return CallWindowProc(s_pOldProc, hWnd, Msg, wParam, lParam);
}

 

 s_pOldProc = (WNDPROC)(INT64)::SetWindowLong(GetDlgItem(IDC_EDIT1)->GetSafeHwnd(), GWL_WNDPROC, (LONG)(INT64)SubProc);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值