//-------------------------------------------------------------------------------------- _Use_decl_annotations_ DXUTAPI bool CDXUTIMEEditBox::StaticMsgProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { UNREFERENCED_PARAMETER(hWnd); UNREFERENCED_PARAMETER(wParam); if (!ImeUi_IsEnabled()) return false; #if defined(DEBUG) || defined(_DEBUG) m_bIMEStaticMsgProcCalled = true; #endif switch (uMsg) { case WM_INPUTLANGCHANGE: DXUTTRACE(L"WM_INPUTLANGCHANGE\n"); { } return true; case WM_IME_SETCONTEXT: DXUTTRACE(L"WM_IME_SETCONTEXT\n"); // // We don't want anything to display, so we have to clear this // lParam = 0; return false; // Handle WM_IME_STARTCOMPOSITION here since // we do not want the default IME handler to see // this when our fullscreen app is running. case WM_IME_STARTCOMPOSITION: DXUTTRACE(L"WM_IME_STARTCOMPOSITION\n"); ResetCompositionString(); // Since the composition string has its own caret, we don't render // the edit control's own caret to avoid double carets on screen. s_bHideCaret = true; return true; case WM_IME_ENDCOMPOSITION: DXUTTRACE(L"WM_IME_ENDCOMPOSITION\n"); s_bHideCaret = false; return false; case WM_IME_COMPOSITION: DXUTTRACE(L"WM_IME_COMPOSITION\n"); return false; } return false; }
bool CIME::StaticMsgProc(UINT uMsg, WPARAM wParam, LPARAM lParam) { HIMC hImc; if(!s_bEnableImeSystem) return false; #if defined(DEBUG) || defined(_DEBUG) m_bIMEStaticMsgProcCalled = true; #endif switch(uMsg) { case WM_ACTIVATEAPP: if(wParam) { // Populate s_Locale with the list of keyboard layouts. UINT cKL = GetKeyboardLayoutList(0, NULL); s_Locale.clear(); HKL *phKL = new HKL[cKL]; if(phKL) { GetKeyboardLayoutList(cKL, phKL); for(UINT i = 0; i < cKL; ++i) { CInputLocale Locale; // Filter out East Asian languages that are not IME. if((PRIMARYLANGID(LOWORD(phKL[i])) == LANG_CHINESE || PRIMARYLANGID(LOWORD(phKL[i])) == LANG_JAPANESE || PRIMARYLANGID(LOWORD(phKL[i])) == LANG_KOREAN) && !_ImmIsIME(phKL[i])) continue; // If this language is already in the list, don't add it again. bool bBreak = false; for(size_t e = 0; e < s_Locale.size(); ++e) if(LOWORD(s_Locale[e].m_hKL) == LOWORD(phKL[i])) { bBreak = true; break; } if(bBreak) break; Locale.m_hKL = phKL[i]; WCHAR wszDesc[128] = L""; switch(PRIMARYLANGID(LOWORD(phKL[i]))) { // Simplified Chinese case LANG_CHINESE: switch(SUBLANGID(LOWORD(phKL[i]))) { case SUBLANG_CHINESE_SIMPLIFIED: Locale.m_wstrLangAbb = s_aszIndicator[INDICATOR_CHS]; break; case SUBLANG_CHINESE_TRADITIONAL: Locale.m_wstrLangAbb = s_aszIndicator[INDICATOR_CHT]; break; default: // unsupported sub-language GetLocaleInfoW(MAKELCID(LOWORD(phKL[i]), SORT_DEFAULT), LOCALE_SABBREVLANGNAME, wszDesc, 128); Locale.m_wstrLangAbb = wszDesc[0]; Locale.m_wstrLangAbb += towlower(wszDesc[1]); break; } break; // Korean case LANG_KOREAN: Locale.m_wstrLangAbb = s_aszIndicator[INDICATOR_KOREAN]; break; // Japanese case LANG_JAPANESE: Locale.m_wstrLangAbb = s_aszIndicator[INDICATOR_JAPANESE]; break; default: // A non-IME language. Obtain the language abbreviation // and store it for rendering the indicator later. GetLocaleInfoW(MAKELCID(LOWORD(phKL[i]), SORT_DEFAULT), LOCALE_SABBREVLANGNAME, wszDesc, 128); Locale.m_wstrLangAbb = wszDesc[0]; Locale.m_wstrLangAbb += towlower(wszDesc[1]); break; } GetLocaleInfoW(MAKELCID(LOWORD(phKL[i]), SORT_DEFAULT), LOCALE_SLANGUAGE, wszDesc, 128); Locale.m_wstrLang = wszDesc; s_Locale.push_back(Locale); } delete[] phKL; } } break; case WM_INPUTLANGCHANGE: UITRACE(L"WM_INPUTLANGCHANGE\n"); { UINT uLang = GetPrimaryLanguage(); CheckToggleState(); if (uLang != GetPrimaryLanguage()) { // Korean IME always inserts on keystroke. Other IMEs do not. s_bInsertOnType = (GetPrimaryLanguage() == LANG_KOREAN); } // IME changed. Setup the new IME. SetupImeApi(); if(_ShowReadingWindow) { if (NULL != (hImc = ImmGetContext(UIGetHWND()))) { _ShowReadingWindow(hImc, false); _ImmReleaseContext(UIGetHWND(), hImc); } } } return true; case WM_IME_SETCONTEXT: UITRACE(L"WM_IME_SETCONTEXT\n"); // // We don't want anything to display, so we have to clear this // lParam = 0; return false; // Handle WM_IME_STARTCOMPOSITION here since // we do not want the default IME handler to see // this when our fullscreen app is running. case WM_IME_STARTCOMPOSITION: UITRACE(L"WM_IME_STARTCOMPOSITION\n"); ResetCompositionString(); // Since the composition string has its own caret, we don't render // the edit control's own caret to avoid double carets on screen. ///ghghgh s_bHideCaret = true; return true; case WM_IME_COMPOSITION: UITRACE(L"WM_IME_COMPOSITION\n"); return false; } return false; }