Windows7 で、IME のレイアウトハンドルを取得する方法をご教授して頂きたいです。
以前までは、以下のコードでIME のハンドルを取得していました。
HKL
IKhDependWatcher::getMSIMEKeyboardLayout()
{
HKL hklResult = NULL;
HKL* pahkl = NULL;
UINT nResultSize;
UINT nIndex;
PWCHAR pszDescription = NULL;
UINT nDescriptionSize = 32;
UINT nDescriptionSizeNew;
try{
// MSIMEの検索
nResultSize = GetKeyboardLayoutList(0, NULL);
pahkl = new HKL[nResultSize];
GetKeyboardLayoutList(nResultSize, pahkl);
pszDescription = new WCHAR[nDescriptionSize];
for(nIndex = 0; nIndex < nResultSize; nIndex++)
{
nDescriptionSizeNew = ImmGetDescription(pahkl[nIndex], NULL, 0) + 1;
if(nDescriptionSizeNew > nDescriptionSize)
{
if(pszDescription != NULL)
delete [] pszDescription;
nDescriptionSize = nDescriptionSizeNew;
pszDescription = new WCHAR[nDescriptionSize];
}
ImmGetDescription(pahkl[nIndex], pszDescription, nDescriptionSize);
_wcslwr(pszDescription);
// "microsoft"という記述があったらMSIMEと限定
if(wcsstr(pszDescription, L"microsoft") != NULL)
{
hklResult = pahkl[nIndex];
break;
}
// KnI 010911 >
// MS-IME97では、”ms-ime97”という文字列がとれる。
if(wcsstr(pszDescription, L"ms-ime") != NULL){
hklResult = pahkl[nIndex];
break;
}
// KnI 010911 <
}
}catch(...){}
if(pszDescription != NULL)
delete [] pszDescription;
if(pahkl != NULL)
delete [] pahkl;
return hklResult;
}
GetKeyboardLayoutList で取得したリストの中から、ImmGetDescription で取得したIME の名称と一致するレイアウトハンドルを返すという処理でした。
しかし、冒頭で述べたように、ImmGetDescription が使用できなくなってしまったため、GetKeyboardLayoutList の中から探せなくなってしまいました。
GetLanguageProfileDescription を使用すれば、Win7 でもIME の名称「Microsoft IME」が取得できたのですが、それでは、肝心なレイアウトハンドルが取れませんでした。
ちなみに、Windows7 には、標準のIME と、ATOK2008 をインストールしているためか、nResultSize = GetKeyboardLayoutList(0, NULL); は「2」が返却されます。
http://msdn.microsoft.com/ja-jp/library/cc364672.aspx
ハードコーディングで、hklResult = pahkl[0]; としてしまえば、IME のレイアウトハンドルがとれているようなのですが、それでは、いかにせよ良くないので、以前と同じように、IME の名称なので検索したいと考えています。
よろしくお願い致します。