BytesLen = ImmGetConversionList(hkl[i], 0, TEXT("测"), 0, 0, GCL_REVERSECONVERSION);
运行时在watch窗口中发现BytesLen竟然为0!
如何改正?ImmGetConversionList应该怎么用?
上面的语句我把第三个选项该为了指定的字符。我不知道怎么才能从中文字符串中获取一个单字符。比如:
LPTSTR strCN = TEXT("测试");
这样声明一个变量保存"测"字?当然就是要能在ImmGetConversionList里用的那种。
输入法用的是微软拼音输入法。
三天内结贴

解决方案 »

  1.   

    提個思路﹐一個例子﹐自己裝入輸入法﹐監視用戶的輸入﹕
    新建一基于对话框的工程,加入一combobox控件,增加控制变量m_cb1。加入一edit控件,增加控制变量m_edt1.对combobox,增加对CBN_SELCHANGE的映射函数OnSelchangeCombo1()。对edit1,增加对EN_SETFOCUOS的SetfocusEdit1().在对话框类头文件的public:下加入数组声明:CString lst[10];
    在OnInitDialog()的return前加如下代码: 
    HKEY hk,hk1;
    long cp=16;
    char lp[15];
    char a[2];
    a[0]='1';
    a[1]='\0';
    CString str,str1;
    str=".DEFAULT\\keyboard layout\\preload\\";//已装的输入法。注:win2000有所不同
    str+=a;
    int i=0;
    while(::RegOpenKey(HKEY_USERS,str,&hk)==ERROR_SUCCESS)//打开键
    {
           a[0]++;//下一子键
           str=".DEFAULT\\keyboard layout\\preload\\";
           str+=a; 
           if(::RegQueryValue(hk,NULL,lp,&cp)!=ERROR_SUCCESS)//已装的输入法
           MessageBox("Error");
           ::RegEnumKeyEx
           str1="System\\CurrentControlSet\\Control\\Keyboard Layouts\\";//keyboardlayoutLayout
           str1+=lp;
           lst[i++]=lp;
           //打开对应的keyboardlayoutLayout
           if(RegOpenKey(HKEY_LOCAL_MACHINE,str1,&hk1)==ERROR_SUCCESS)
           {
           LPBYTE lpD=new BYTE[80];//DataValue
           DWORD lpT=REG_SZ;//DataType
           DWORD lpS=80; //DataSize
           if(RegQueryValueEx(hk1,"Layout text",NULL,&lpT,lpD,&lpS)!=ERROR_SUCCESS)
           MessageBox("Query error",(LPCTSTR)lpD);
           m_cb1.AddString((LPCTSTR)lpD);
           delete lpD;
           }
           else MessageBox("open error");
           RegCloseKey(hk1);
    }
    ::RegCloseKey(hk);
    m_cb1.SetCurSel(0);
    在OnSetfocusEdit1()加入如下代码: 
           CString temp;
           temp=m_cb1.GetCurSel()!=CB_ERR?lst[m_cb1.GetCurSel()]:"00000409";
           HKL hkl;
           hkl=LoadKeyboardLayout(temp,KLF_ACTIVATE);//装载输入法
           if(hkl==NULL) OnOK();
           ActivateKeyboardLayout(hkl,KLF_SETFORPROCESS);//激活输入法
    在OnSelchangeCombo1()加入如下代码: 
          m_edt1.SetFocus();
    你那個問題我也沒見過﹐不知道這個例子對你有沒有一些借鑒的作用。