none
Windows7 でのIMEのレイアウトハンドルの取得 RRS feed

  • 質問

  • 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 の名称なので検索したいと考えています。

    よろしくお願い致します。



    • 編集済み KYS31 2011年9月14日 10:16
    2011年9月14日 10:12

すべての返信

  • 一点確認したいのですが HKL = 入力ロケール識別子 (旧名キーボードレイアウト)を取得して何をしたいのでしょうか?
    すでにGetLanguageProfileDescriptionを使っているのでText Services Framework (TSF)はご存知かと思います
    IME操作ならばHKLを引数とするIMM APIではなくTSFを使うことでほぼ代替できると思うのですがそれでは駄目ですか?

    • 回答の候補に設定 山本春海 2011年10月7日 6:01
    2011年9月16日 14:58