void CIme::SetImeIcon() { HICON hIcon = NULL; if( ImmIsIME( m_hCurKL ) ) { char buf[256]; ImmGetIMEFileName( m_hCurKL, buf, 256 ); HMODULE hDll = LoadLibrary( buf ); EnumResourceNames( hDll, RT_GROUP_ICON, (ENUMRESNAMEPROC)EnumResNameProc, (int32)(void*)&hIcon ); FreeLibrary( hDll ); } m_ImeImage.Release(); if( hIcon ) { IGraphic* pGraphic = CGraphic::GetInst(); CFRect rt = CFRect( 0, 0, 16, 16 ); m_ImeImage.AddImage( pGraphic, -1, NULL, &rt, CFPos(0.0f, 0.0f), 0xffffffff ); pGraphic->CreateTexture( 16, 16, TF_UNKNOW, &m_ImeImage.GetImage(0).pTexture ); ICONINFO Info; GetIconInfo( hIcon, &Info ); m_ImeImage.GetImage(0).pTexture->FillFromHBitmap( Info.hbmColor, Info.hbmMask ); ::DestroyIcon( hIcon ); } OnImeChanged(); }
void _gdk_windowing_init (void) { gchar buf[10]; if (getenv ("GDK_IGNORE_WINTAB") != NULL) _gdk_input_ignore_wintab = TRUE; else if (getenv ("GDK_USE_WINTAB") != NULL) _gdk_input_ignore_wintab = FALSE; if (gdk_synchronize) GdiSetBatchLimit (1); _gdk_app_hmodule = GetModuleHandle (NULL); _gdk_display_hdc = CreateDC ("DISPLAY", NULL, NULL, NULL); _gdk_input_locale = GetKeyboardLayout (0); _gdk_input_locale_is_ime = ImmIsIME (_gdk_input_locale); GetLocaleInfo (MAKELCID (LOWORD (_gdk_input_locale), SORT_DEFAULT), LOCALE_IDEFAULTANSICODEPAGE, buf, sizeof (buf)); _gdk_input_codepage = atoi (buf); GDK_NOTE (EVENTS, g_print ("input_locale:%p, codepage:%d\n", _gdk_input_locale, _gdk_input_codepage)); CoInitialize (NULL); _gdk_selection = gdk_atom_intern_static_string ("GDK_SELECTION"); _wm_transient_for = gdk_atom_intern_static_string ("WM_TRANSIENT_FOR"); _targets = gdk_atom_intern_static_string ("TARGETS"); _delete = gdk_atom_intern_static_string ("DELETE"); _save_targets = gdk_atom_intern_static_string ("SAVE_TARGETS"); _utf8_string = gdk_atom_intern_static_string ("UTF8_STRING"); _text = gdk_atom_intern_static_string ("TEXT"); _compound_text = gdk_atom_intern_static_string ("COMPOUND_TEXT"); _text_uri_list = gdk_atom_intern_static_string ("text/uri-list"); _text_html = gdk_atom_intern_static_string ("text/html"); _image_png = gdk_atom_intern_static_string ("image/png"); _image_jpeg = gdk_atom_intern_static_string ("image/jpeg"); _image_bmp = gdk_atom_intern_static_string ("image/bmp"); _image_gif = gdk_atom_intern_static_string ("image/gif"); _local_dnd = gdk_atom_intern_static_string ("LocalDndSelection"); _gdk_win32_dropfiles = gdk_atom_intern_static_string ("DROPFILES_DND"); _gdk_ole2_dnd = gdk_atom_intern_static_string ("OLE2_DND"); /* MS Office 2007, at least, offers images in common file formats * using clipboard format names like "PNG" and "JFIF". So we follow * the lead and map the GDK target name "image/png" to the clipboard * format name "PNG" etc. */ _cf_png = RegisterClipboardFormat ("PNG"); _cf_jfif = RegisterClipboardFormat ("JFIF"); _cf_gif = RegisterClipboardFormat ("GIF"); _cf_url = RegisterClipboardFormat ("UniformResourceLocatorW"); _cf_html_format = RegisterClipboardFormat ("HTML Format"); _cf_text_html = RegisterClipboardFormat ("text/html"); _gdk_win32_selection_init (); }
BOOL MakeInfoStringPRC( PCONSOLE_TABLE ConTbl, LPCONIME_UIMODEINFO lpModeInfo ) { DWORD j; DWORD ModeInfoPtr; DWORD LengthForDisp; ModeInfoPtr = 0; if (ImmIsIME(ConTbl->hklActive) ) { ModeInfoPtr = MakeStatusStrPRC1(ConTbl, lpModeInfo, ModeInfoPtr); if (ConTbl->fInComposition) { if (ConTbl->fInCandidate) { ModeInfoPtr = IncludeCandidateP(ConTbl, lpModeInfo, ModeInfoPtr); } else { ModeInfoPtr = IncludeCompositionP(ConTbl, lpModeInfo, ModeInfoPtr); } } ModeInfoPtr = MakeStatusStrPRC2(ConTbl, lpModeInfo, ModeInfoPtr); } lpModeInfo->ModeStringLen = ModeInfoPtr; lpModeInfo->Position = VIEW_LEFT; return TRUE; }
void CIme::DisableIme() { while( ImmIsIME( GetKeyboardLayout( 0 ))) ActivateKeyboardLayout(( HKL )HKL_NEXT, 0 );//如果ime打开通过循环切换到下一个关闭 m_bIme = false; m_szImeName[ 0 ] = 0; m_szCompStr[ 0 ] = 0; m_szCompReadStr[ 0 ] = 0; m_szCandList[ 0 ] = 0; m_nImeCursor = 0; }
void _gdk_windowing_init (void) { gchar buf[10]; #ifdef HAVE_WINTAB if (getenv ("GDK_IGNORE_WINTAB") != NULL) _gdk_input_ignore_wintab = TRUE; else if (getenv ("GDK_USE_WINTAB") != NULL) _gdk_input_ignore_wintab = FALSE; #endif if (gdk_synchronize) GdiSetBatchLimit (1); _gdk_app_hmodule = GetModuleHandle (NULL); _gdk_display_hdc = CreateDC ("DISPLAY", NULL, NULL, NULL); _gdk_input_locale = GetKeyboardLayout (0); _gdk_input_locale_is_ime = ImmIsIME (_gdk_input_locale); GetLocaleInfo (MAKELCID (LOWORD (_gdk_input_locale), SORT_DEFAULT), LOCALE_IDEFAULTANSICODEPAGE, buf, sizeof (buf)); _gdk_input_codepage = atoi (buf); GDK_NOTE (EVENTS, g_print ("input_locale:%p, codepage:%d\n", _gdk_input_locale, _gdk_input_codepage)); CoInitialize (NULL); _cf_rtf = RegisterClipboardFormat ("Rich Text Format"); _cf_utf8_string = RegisterClipboardFormat ("UTF8_STRING"); _cf_image_bmp = RegisterClipboardFormat ("image/bmp"); _gdk_selection_property = gdk_atom_intern ("GDK_SELECTION", FALSE); _wm_transient_for = gdk_atom_intern ("WM_TRANSIENT_FOR", FALSE); _targets = gdk_atom_intern ("TARGETS", FALSE); _save_targets = gdk_atom_intern ("SAVE_TARGETS", FALSE); _utf8_string = gdk_atom_intern ("UTF8_STRING", FALSE); _text = gdk_atom_intern ("TEXT", FALSE); _compound_text = gdk_atom_intern ("COMPOUND_TEXT", FALSE); _text_uri_list = gdk_atom_intern ("text/uri-list", FALSE); _image_bmp = gdk_atom_intern ("image/bmp", FALSE); _local_dnd = gdk_atom_intern ("LocalDndSelection", FALSE); _gdk_win32_dropfiles = gdk_atom_intern ("DROPFILES_DND", FALSE); _gdk_ole2_dnd = gdk_atom_intern ("OLE2_DND", FALSE); _gdk_win32_selection_init (); }
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继续处理 }
BOOL GetOpenStatusByCodepage( HIMC hIMC, PCONSOLE_TABLE ConTbl ) { switch ( HKL_TO_LANGID(ConTbl->hklActive)) { case LANG_ID_JAPAN: return ImmGetOpenStatus(hIMC); break; case LANG_ID_TAIWAN: case LANG_ID_PRC: case LANG_ID_KOREA: if (ImmGetOpenStatus(hIMC)) { return ImmIsIME(ConTbl->hklActive); } break; default: return FALSE; } return FALSE; }
LONG CImeView::OnInputLangChange(WPARAM dwCommand, LPARAM dwData) { if (ImmIsIME(m_hKeyLayout) && m_property & IME_PROP_AT_CARET) ClearData(); // Set new keyboard layout. InitIme(); if(Enter()) { for (int i = 0; i < MAX_LISTCAND; i++) { CANDIDATEFORM cf; if (m_property & IME_PROP_AT_CARET) { /* // This application do not want to set candidate window to // any position. Anyway, if an application need to set the // candiadet position, it should remove the if 0 code // the position you want to set cf.dwIndex = i; cf.dwStyle = CFS_CANDIDATEPOS; cf.ptCurrentPos.x = ptAppWantPosition[i].x; cf.ptCurrentPos.y = ptAppWantPosition[i].y; ImmSetCandidateWindow(m_hIMC, &CandForm ); */ } else { if (!ImmGetCandidateWindow(m_hIMC, i, &cf)) continue; if (cf.dwStyle == CFS_DEFAULT) continue; cf.dwStyle = CFS_DEFAULT; ImmSetCandidateWindow(m_hIMC, &cf); } } Leave(); } return (LONG)DefWindowProc(m_hWnd,WM_INPUTLANGCHANGE, dwCommand, dwData); }
static HRESULT WINAPI ActiveIMMApp_IsIME(IActiveIMMApp* This, HKL hKL) { return ImmIsIME(hKL); }
LRESULT CALLBACK EditCtlProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam) { LPCTSTR lpTable, lpTable1; TCHAR c; #ifdef FAREAST TCHAR ch, chHW; #endif // FAREAST HKL hkl = GetKeyboardLayout(0); ASSERT(oldEditCtlProc); switch (message) { case WM_PASTE : { BOOL bPassThrough = TRUE; if (IsNumericOnlyEdit(hwnd)) { // only going to accept pastes that have pure numeric data in them HANDLE hMem; if(OpenClipboard(hwnd)) { hMem = GetClipboardData(CF_UNICODETEXT); if(hMem) { TCHAR *pText = (TCHAR *)LocalLock(hMem); // can't fail on CE int iLen = _tcslen(pText); int iPos = 0; for (iPos = 0; (iPos < iLen) && bPassThrough; iPos++) { if (!_istdigit(pText[iPos])) { // bad char bPassThrough = FALSE; } } LocalUnlock(hMem); } CloseClipboard(); } } if (bPassThrough) { return CallWindowProc(oldEditCtlProc,hwnd, message, wParam, lParam); } else { MessageBeep(MB_OK); return FALSE; } } break; case WM_IME_COMPOSITION: if( ImmIsIME(hkl ) && LOWORD(hkl ) == MAKELANGID(LANG_KOREAN, SUBLANG_DEFAULT)) { HIMC himc = ImmGetContext(hwnd); if (himc) { TCHAR szTempStr[4]; if (0<ImmGetCompositionString(himc,GCS_COMPSTR, szTempStr, 4)) { DWORD fdwConversion; DWORD fdwSentence; ImmNotifyIME(himc,NI_COMPOSITIONSTR,CPS_CANCEL,0); ImmGetConversionStatus(himc, &fdwConversion, &fdwSentence); fdwConversion&=(~IME_CMODE_NATIVE); ImmSetConversionStatus(himc,fdwConversion, fdwSentence); } ImmReleaseContext(hwnd,himc); return CallWindowProc(oldEditCtlProc,hwnd, message, wParam, lParam); } } break; case WM_CHAR: #ifdef FAREAST // Convert full-width numbers to half width ch = (TCHAR)wParam; LCMapString(LOCALE_USER_DEFAULT, LCMAP_HALFWIDTH, &ch, 1, &chHW, 1); wParam = (WPARAM)chHW; #endif // FAREAST // This character is not ASCII. If your country/region needs specific characters. You // have to change this. Otherwise, we abandon this character. if (wParam >= 0x80 ) { // service on ilegal chars MessageBeep(MB_OK); return TRUE; } if (wParam < VK_SPACE || wParam > 0x7e ) { // service on legal chars //DPF("None ascii char. ignore \r\n "); break; } if ((lpTable = GetTable(hwnd)) == NULL) { // DPF("Can not find table, trying parent \r\n"); if ((lpTable = GetTable(GetParent(hwnd))) == NULL) { //DPF("Can not find table, \r\n"); break; } } lpTable1 = lpTable; if (wParam >= '0' && wParam <= '9') goto found; while ((c = *lpTable++) > 0) { if ((TCHAR)wParam == c) goto found; } // now try w/ upper case if (iswlower((TCHAR)wParam)) { wParam = (LPARAM)towupper((TCHAR)wParam); while ((c = *lpTable1++) > 0) { if ((TCHAR)wParam == c) goto found; } } //DPF1("Char '%c' not in table\r\n", wParam); MessageBeep(MB_OK); return TRUE; found: //DPF1("Found char '%c' in table\r\n", wParam); break; default: break; } // of switch return CallWindowProc(oldEditCtlProc, hwnd, message, wParam, lParam); }
/************************************************************************ * * InputChangeHandler - WM_INPUTLANGCHANGE handler * ************************************************************************/ void InputChangeHandler( HWND hWnd ) { HIMC hIMC; // // If the old keyboard layout is IME, the ime ui data have to be free. // if (ImmIsIME(hCurKL)) { // // If application prefers to use near caret provded by IME, or // IME provides special UI, then no need to clean UD data. // if ( gImeUIData.fdwProperty & IME_PROP_SPECIAL_UI ) ; else if ( gImeUIData.fdwProperty & IME_PROP_AT_CARET ) ImeUIClearData(hWnd); else ; } // // Set new keyboard layout. // hCurKL = GetKeyboardLayout(0L); // // Get new property. // gImeUIData.fdwProperty = ImmGetProperty( hCurKL, IGP_PROPERTY ); // if this application set the candidate position, it need to set // it to default for the near caret IME if ( hIMC = ImmGetContext( hWnd ) ) { UINT i; for (i = 0; i < 4; i++) { CANDIDATEFORM CandForm; if ( gImeUIData.fdwProperty & IME_PROP_AT_CARET ) { CandForm.dwIndex = i; CandForm.dwStyle = CFS_CANDIDATEPOS; #if 0 // This application dooes not want to set candidate window // to any position. If an application need to set the // candidate position, it should remove the if 0 code // the position you want to set CandForm.ptCurrentPos.x = ptAppWantPosition[i].x; CandForm.ptCurrentPos.y = ptAppWantPosition[i].y; ImmSetCandidateWindow( hIMC, &CandForm ); #endif } else { if ( !ImmGetCandidateWindow( hIMC, i, &CandForm ) ) { continue; } if ( CandForm.dwStyle == CFS_DEFAULT ) { continue; } CandForm.dwStyle = CFS_DEFAULT; ImmSetCandidateWindow( hIMC, &CandForm ); } } ImmReleaseContext( hWnd, hIMC ); } return; }
// 处理WM_KEYDOWN消息 LRESULT CDuiWkeView::OnWmKeyDown(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { bool handled = true; unsigned int virtualKeyCode = wParam; unsigned int flags = 0; bool bShiftState = false; if (HIWORD(lParam) & KF_REPEAT) flags |= WKE_REPEAT; if (HIWORD(lParam) & KF_EXTENDED) flags |= WKE_EXTENDED; if((GetKeyState(VK_SHIFT) & 0x8000) || (VK_SHIFT == wParam)) bShiftState = true; HKL hKL = GetKeyboardLayout(0); int i = LOWORD(hKL); TCHAR buffer[255]; memset(buffer,0,255 * sizeof(TCHAR)); if( (i == 0x0804) && (ImmIsIME(hKL)) ) { ImmGetDescription(hKL,buffer,255); if(buffer[0] != NULL) { if(( wParam & 0x80 ) | (wParam >= 0x70 && wParam <= 0x7F )) { if( !IsFocusControl() ) return 0; } } } if(wParam >= 0x70 && wParam <= 0x7F ) { handled = m_pWebView->keyDown(virtualKeyCode, flags, false); m_render.render(m_pWebView); if( wParam == 0x74 ) { MSG msg; msg.hwnd = hWnd; msg.message = WM_CHAR; msg.wParam = virtualKeyCode; msg.lParam = lParam; ::TranslateMessage(&msg); ::DispatchMessage(&msg); } if( !IsFocusControl() ) return 0; } handled = m_pWebView->keyDown(virtualKeyCode, flags, false); m_render.render(m_pWebView); if(!bShiftState) { if( !GetKeyState(VK_CAPITAL) ) { if((wParam >= 'A') && (wParam <= 'Z')) virtualKeyCode = tolower(wParam); } if(wParam != VK_SHIFT) { if( wParam > 0x80 ) return 0; } }else { if(wParam != VK_SHIFT) { //wParam = wParam & 0x7F;//`~ //virtualKeyCode = wParam; if(wParam == '1' || wParam == '3' || wParam == '4' || wParam == '5' ) virtualKeyCode = wParam - 0x10; else if(wParam == '2') virtualKeyCode = '@'; else if(wParam == '6') virtualKeyCode = '^'; else if(wParam == '7') virtualKeyCode = '&'; else if( wParam == '8') virtualKeyCode = '*' ; else if( wParam == '9') virtualKeyCode = '('; else if(wParam == '0') virtualKeyCode = ')'; else if(wParam == 45) virtualKeyCode = '_'; else if(wParam == '=') virtualKeyCode = '+'; else if(wParam == '[') virtualKeyCode = '{'; else if(wParam == ']') virtualKeyCode = '}'; else if(wParam == ';') virtualKeyCode = ':'; else if(wParam == '\'') virtualKeyCode = '"'; else if(wParam == '\\') virtualKeyCode = '|'; else if(wParam == ',') virtualKeyCode = '<'; else if(wParam == '.') virtualKeyCode = '>'; else if(wParam == '/') virtualKeyCode = '?'; else if(wParam == '`') virtualKeyCode = '~'; else if(wParam > 0x80) return 0; } } MSG msg; msg.hwnd = hWnd; msg.message = WM_CHAR; msg.wParam = virtualKeyCode; msg.lParam = lParam; ::TranslateMessage(&msg); ::DispatchMessage(&msg); return 0; }