我想获取当前输入法名称,详细代码就不说了,网上有,主要是调用 GetKeyboardLayout 和 ImmGetDescription 这两个函数,或者调用 GetKeyboardLayout  获取输入法的 HKL 后再在注册表中查找输入法名称。但是有一个奇怪的问题,对于“五笔”、“双拼”、“紫光拼音”这些输入法获得的结果都是对的,但有少数输入法获取的名称却不对,例于我实验时用“微软拼音输入法 2003”时,获取的输入法名称却是“中文(简体)-美式键盘”。另外我经过试验发现,当输入法设置为“微软拼音输入法 2003”时,调用 GetKeyboardLayoutName 获得的值是 00000804,而这个值正是“中文(简体)-美式键盘”的 GetKeyboardLayoutName 。
不知道为什么会出现这样的情况,请教高手。我想知道如何能够准确地获得当前输入法的名称。

解决方案 »

  1.   

    我电脑上没有“微软拼音输入法 2003”,试试看下面的代码是否正常#include "imm.h"
    #pragma comment(lib, "imm32.lib")
    void EnumKbLayout() //枚举KeyboardLayout   

      int nSize = GetKeyboardLayoutList(0 , 0);   
      if(nSize != 0)   
      {   
        HKL FAR * lpList = (HKL FAR *)new HKL[nSize];   
        ZeroMemory(lpList, sizeof(HKL) * nSize);   
        if(GetKeyboardLayoutList(nSize, lpList) == nSize)   
        {   
          for(int i=0; i<nSize; i++)   
          {   
            HKL Val = lpList[i];   
            TCHAR uChar[1025] = {0};
            ImmGetDescription(Val, uChar, 1024);        CString dbgStr;   
            dbgStr.Format( _T("HKL=%08X [%s]\r\n"), Val, uChar);           
            OutputDebugString(dbgStr);
          }   
        }   
        delete []lpList;   
      }    

      

  2.   

    To zgl7903:谢谢你的代码,这段代码可以运行,但它是列举当前已经添加的输入法列表,我要实现的是取出当前激活的输入法名称(只可能是一个).列举所有输入法的时候,“微软拼音输入法 2003”是可以获得的,这个我也实现了,但是获取当前选择的输入法的时候,只要是“微软拼音输入法 2003”,获取的结果就不对.继续等待高手解决.另外,不是默认输入法设置的原因,我的默认输入法不是“微软拼音输入法 2003”.
      

  3.   

    在不同的程序间切换时 输入法是会跟着变的 如我在CSDN论坛逛时是搜狗输入法 QQ来消息打开时还是默认输入法 我得切换一下才行
    你在执行你的程序时 当前的输入法是什么
    焦点给到你的程序时 输入法又是什么 
    你可以在点击你程序的按钮前 先切换输入法试试
      

  4.   

    没有列举到的都是TSF框架的输入法