#include <Imm.h>\r
#include <Shlwapi.h>\r
#include <TlHelp32.h>\r
-\r
+#include <msctf.h>\r
\r
#ifdef _DEBUG\r
#undef THIS_FILE\r
\r
EnumWindows(EnumWindowsProc, (LPARAM)cApplicationList);\r
\r
+ CString szListItem;\r
for (int i = 0; i < MAX_APP; ++i) {\r
CString szApplicationName = m_Data[i].GetApplicationName();\r
CString szApplicationTitle = m_Data[i].GetApplicationTitle();\r
-\r
- CString szListItem;\r
+ if (szApplicationName == _T("IME")) // IDS_IME_FILE_NAME\r
+ continue;\r
szListItem.Format(IDS_APPLICATION_LIST_ITEM, szApplicationTitle, szApplicationName);\r
if (IsNotSameString(cApplicationList, szListItem)\r
&& !IsDefault(szApplicationName)\r
}\r
}\r
\r
- // Add IME\r
- HKL hKL = GetKeyboardLayout(0);\r
- if (ImmIsIME(hKL)) {\r
- LPTSTR szIMEDescription = NULL;\r
- UINT nIMEDescription = ImmGetDescription(hKL, NULL, 0);\r
- if (nIMEDescription) {\r
- nIMEDescription += sizeof(TCHAR); // for NULL\r
- if ((szIMEDescription = new TCHAR[nIMEDescription]) != NULL) {\r
- ImmGetDescription(hKL, szIMEDescription, nIMEDescription);\r
- }\r
-// CUtils::Log(_T("nIMEDescription = %d, szIMEDescription = _%s_"), nIMEDescription, szIMEDescription);\r
- }\r
-\r
- LPTSTR szIMEFileName = NULL;\r
- UINT nIMEFileName = ImmGetIMEFileName(hKL, NULL, 0);\r
- if (nIMEFileName) {\r
- nIMEFileName += sizeof(TCHAR);\r
- if ((szIMEFileName = new TCHAR[nIMEFileName]) != NULL) {\r
- ImmGetIMEFileName(hKL, szIMEFileName, nIMEFileName);\r
- }\r
-// CUtils::Log(_T("nIMEFileName = %d, szIMEFileName = _%s_"), nIMEFileName, szIMEFileName);\r
- }\r
-\r
- CString szIMETitle;\r
- CString szIME(MAKEINTRESOURCE(IDS_IME_FILE_NAME));\r
- szIMETitle.Format(IDS_APPLICATION_LIST_ITEM, szIMEDescription ? szIMEDescription : szIME, szIMEFileName ? szIMEFileName : szIME);\r
-// CUtils::Log(_T("szIMETitle = _%s_, szIMEDescription = _%s_, szIMEFileName = _%s_"), szIMETitle, szIMEDescription, szIMEFileName);\r
- if (IsNotSameString(cApplicationList, szIMETitle)) {\r
- cApplicationList->AddString(szIMETitle);\r
- }\r
-\r
- delete[] szIMEDescription;\r
- szIMEDescription = NULL;\r
- delete[] szIMEFileName;\r
- szIMEFileName = NULL;\r
- }\r
+ TCHAR szFilename[MAX_PATH];\r
+ TCHAR szDescription[WINDOW_TEXT_LENGTH];\r
+ GetIMEInfo(szFilename, szDescription);\r
+ szListItem.Format(IDS_APPLICATION_LIST_ITEM, szDescription, szFilename);\r
+ if (IsNotSameString(cApplicationList, szListItem))\r
+ cApplicationList->AddString(szListItem);\r
\r
// Add Dialog\r
cApplicationList->InsertString(0, CString(MAKEINTRESOURCE(IDS_DIALOG_TITLE)));\r
cApplicationList->SelectString(-1, CString(MAKEINTRESOURCE(IDS_DEFAULT_TITLE)));\r
}\r
\r
+void CProfile::GetIMEInfo(const LPTSTR szFilename, const LPTSTR szDescription)\r
+{\r
+ _tcscpy_s(szFilename, MAX_PATH, _T("IME")); // IDS_IME_FILE_NAME;\r
+ _tcscpy_s(szDescription, WINDOW_TEXT_LENGTH, _T("Input Method Editor"));\r
+ HKL hKL = GetKeyboardLayout(0);\r
+ if (!ImmIsIME(hKL))\r
+ return;\r
+ TCHAR buf[MAX_PATH]; // larger than WINDOW_TEXT_LENGTH\r
+ if (ImmGetDescription(hKL, buf, WINDOW_TEXT_LENGTH)) {\r
+ _tcscpy_s(szDescription, WINDOW_TEXT_LENGTH, buf);\r
+ goto filename;\r
+ }\r
+ // try TSF\r
+ CoInitialize(NULL);\r
+ HRESULT hr;\r
+ ITfInputProcessorProfiles *pProfiles;\r
+ hr = CoCreateInstance(CLSID_TF_InputProcessorProfiles, NULL, CLSCTX_INPROC_SERVER, IID_ITfInputProcessorProfiles, reinterpret_cast<LPVOID*>(&pProfiles));\r
+ if (SUCCEEDED(hr)) {\r
+ const LANGID langid = GetUserDefaultLangID();\r
+ CLSID clsid;\r
+ GUID guid;\r
+ hr = pProfiles->GetDefaultLanguageProfile(langid, GUID_TFCAT_TIP_KEYBOARD, &clsid, &guid);\r
+ if (SUCCEEDED(hr)) {\r
+ BSTR bstr;\r
+ hr = pProfiles->GetLanguageProfileDescription(clsid, langid, guid, &bstr);\r
+ if (SUCCEEDED(hr)) {\r
+#ifdef _MBCS\r
+ WideCharToMultiByte(CP_ACP, 0, bstr, -1, szDescription, MAX_PATH, NULL, NULL);\r
+#else\r
+ wcscpy_s(szDescription, WINDOW_TEXT_LENGTH, bstr);\r
+#endif\r
+ SysFreeString(bstr);\r
+ }\r
+ }\r
+ pProfiles->Release();\r
+ }\r
+ CoUninitialize();\r
+filename:\r
+ if (ImmGetIMEFileName(hKL, buf, MAX_PATH))\r
+ _tcscpy_s(szFilename, MAX_PATH, buf);\r
+}\r
+\r
void CProfile::GetTaskList()\r
{\r
ZeroMemory(m_TaskList, sizeof(m_TaskList));\r