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(); }
HKL GetMyHKL() { DWORD dwSize; DWORD dwi; HKL hKL = 0; HKL *lphkl; dwSize = GetKeyboardLayoutList(0, NULL); lphkl = (HKL *)GlobalAlloc(GPTR, dwSize * sizeof(DWORD)); if (!lphkl) return NULL; GetKeyboardLayoutList(dwSize, lphkl); for (dwi = 0; dwi < dwSize; dwi++) { char szFile[32]; HKL hKLTemp = *(lphkl + dwi); ImmGetIMEFileName(hKLTemp, szFile, sizeof(szFile)); if (!_tcsicmp(szFile, FREEPYFILENAME)) { hKL = hKLTemp; goto exit; } } exit: GlobalFree((HANDLE)lphkl); return hKL; }
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; }