bool CIme::OnWM_INPUTLANGCHANGE( HWND hWnd ){ //ime改变 HKL hKL = GetKeyboardLayout( 0 ); if( ImmIsIME( hKL )){ HIMC hIMC = ImmGetContext( hWnd ); ImmEscape( hKL, hIMC, IME_ESC_IME_NAME, m_szImeName );//取得新输入法名字 DWORD dwConversion, dwSentence; ImmGetConversionStatus( hIMC, &dwConversion, &dwSentence ); m_bImeSharp = ( dwConversion & IME_CMODE_FULLSHAPE )? true : false;//取得全角标志 m_bImeSymbol = ( dwConversion & IME_CMODE_SYMBOL )? true : false;//取得中文标点标志 ImmReleaseContext( hWnd, hIMC ); } else//英文输入 m_szImeName[ 0 ] = 0; return false;//总是返回false,因为需要窗口函数调用DefWindowProc继续处理 }
void CandNotifyIME(HWND hCandWnd, WORD wCode) { LPCUIPRIV lpUIPriv; HIMC hIMC; lpUIPriv = (LPCUIPRIV)GetWindowLong(hCandWnd, IMMGWL_PRIVATE); if (!lpUIPriv) { return; } if (!lpUIPriv->lpCandList) { return; } hIMC = (HIMC)GetWindowLong(hCandWnd, IMMGWL_IMC); if (!hIMC) { return; } switch(wCode) { case CLN_SELECTION: ImmNotifyIME(hIMC, NI_SELECTCANDIDATESTR, 0L, lpUIPriv->lpCandList->dwSelection); break; case CLN_DETERMINE: ImmNotifyIME(hIMC, NI_SELECTCANDIDATESTR, 0L, lpUIPriv->lpCandList->dwSelection); ImmEscape((HKL)NULL, hIMC, IME_ESC_PRIVATE_FIRST, NULL); break; case CLN_PAGESTART: ImmNotifyIME(hIMC, NI_SETCANDIDATE_PAGESTART, 0L, lpUIPriv->lpCandList->dwPageStart); break; default: break; } return; }
void CTextInputCtrl::OnKeyDown(WPARAM wParam, LPARAM lParam) { UINT nSelStart; UINT nSelEnd; HIMC himc; switch (0xff & wParam) { case VK_LEFT: if (GetKeyState(VK_SHIFT) & 0x80) { nSelStart = _editor.GetSelectionStart(); nSelEnd = _editor.GetSelectionEnd(); if (nSelStart > 0) { _editor.MoveSelection(nSelStart - 1, nSelEnd); } } else { _editor.MoveSelectionPrev(); } InvalidateRect(_hwnd, NULL, TRUE); break; case VK_RIGHT: if (GetKeyState(VK_SHIFT) & 0x80) { nSelStart = _editor.GetSelectionStart(); nSelEnd = _editor.GetSelectionEnd(); _editor.MoveSelection(nSelStart, nSelEnd + 1); } else { _editor.MoveSelectionNext(); } InvalidateRect(_hwnd, NULL, TRUE); break; case VK_UP: _editor.MoveSelectionUpDown(TRUE); InvalidateRect(_hwnd, NULL, TRUE); break; case VK_DOWN: _editor.MoveSelectionUpDown(FALSE); InvalidateRect(_hwnd, NULL, TRUE); break; case VK_HOME: _editor.MoveSelectionToLineFirstEnd(TRUE); InvalidateRect(_hwnd, NULL, TRUE); break; case VK_END: _editor.MoveSelectionToLineFirstEnd(FALSE); InvalidateRect(_hwnd, NULL, TRUE); break; case VK_DELETE: nSelStart = _editor.GetSelectionStart(); nSelEnd = _editor.GetSelectionEnd(); if (nSelStart == nSelEnd) { _editor.DeleteAtSelection(FALSE); } else { _editor.RemoveText(nSelStart, nSelEnd - nSelStart); _editor.MoveSelection(nSelStart, nSelStart); } InvalidateRect(_hwnd, NULL, TRUE); break; case VK_BACK: nSelStart = _editor.GetSelectionStart(); nSelEnd = _editor.GetSelectionEnd(); if (nSelStart == nSelEnd) { _editor.DeleteAtSelection(TRUE); _editor.MoveSelectionPrev(); } else { _editor.RemoveText(nSelStart, nSelEnd - nSelStart); _editor.MoveSelection(nSelStart, nSelStart); } InvalidateRect(_hwnd, NULL, TRUE); break; case VK_HANJA: himc = ImmGetContext(_hwnd); if (himc) { WCHAR sz[2]; sz[0] = L'\0'; sz[1] = L'\0'; nSelStart = _editor.GetSelectionStart(); if (_editor.GetText(nSelStart, (LPWSTR)sz, 1)) { _editor.MoveSelection(nSelStart, nSelStart + 1); _editor.OnStartComposition(); ImmEscape(GetKeyboardLayout(NULL), himc, IME_ESC_HANJA_MODE, (LPVOID)sz); InvalidateRect(_hwnd, NULL, TRUE); } ImmReleaseContext(_hwnd, himc); } break; } }
BOOL GetIMEName( PCONSOLE_TABLE ConTbl ) { WCHAR buf[MaxBufSize]; WCHAR name[MaxBufSize]; DWORD bufsize = MaxBufSize; LONG lResult; HKEY hkLayout; int i; ConTbl->LayoutName[0] = TEXT('\0'); ConTbl->GuideLine[0] = TEXT('\0'); if (ImmEscape(ConTbl->hklActive, ConTbl->hIMC_Current, IME_ESC_IME_NAME, (LPTSTR)&name) == 0) { if (!ImmGetIMEFileName(ConTbl->hklActive, (LPTSTR)&name, MaxBufSize ) ) { if (GetKeyboardLayoutName((LPTSTR)&name) ) { /* * quick dirty ImmIsIME */ if (name[0] != TEXT('E') && name[0] != TEXT('e')) { return FALSE; } lstrcpy( buf, KBDLAYOUT ); lstrcat( buf, KBDSEPALATER ); lstrcat( buf, name ); lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, (LPCTSTR)buf, 0, KEY_QUERY_VALUE | KEY_ENUMERATE_SUB_KEYS, &hkLayout ); if ( lResult == ERROR_SUCCESS ) { lResult = RegQueryValueEx( hkLayout, KBDLAYOUTTEXT, NULL, NULL, (LPBYTE)ConTbl->LayoutName, &bufsize ); RegCloseKey( hkLayout ); if (ConTbl->LayoutName[0] != TEXT('\0')) { for (i = 0; i < 8; i ++) { if ((ConTbl->LayoutName[0] == IMECGuide[i][0]) && (ConTbl->LayoutName[1] == IMECGuide[i][1]) ) { lstrcpyn(&(ConTbl->GuideLine[0]), &(IMECGuide[i][2]), IMECGuideLen+1); break; } } } } else { return FALSE; } } else { return FALSE; } } else { lstrcpy( ConTbl->LayoutName, name ); } } else { lstrcpy( ConTbl->LayoutName, name); } return TRUE; }