⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_22778.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:22778 发表者:zhidongdong 发表日期:2002-11-28 13:03:47
<br>主题:如何添加微软拼音输入法
<br>内容:如何添加微软拼音输入法?<BR>(需要源代码)谢谢!
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:徐景周 回复日期:2002-11-28 14:08:20
<br>内容:没有直接源码,你只有借鉴,<BR>如:<BR>http://www.csdn.net/develop/Read_Article.asp?Id=14743<BR><BR>http://www.csdn.net/develop/Read_Article.asp?Id=8024<BR><BR>http://www.csdn.net/develop/Read_Article.asp?Id=15556<BR><BR>http://www.csdn.net/develop/Read_Article.asp?Id=13692<BR><BR><BR>初探WINDOWS下IME编程 <BR>大家知道,DELPHI许多控件有IME属性。这么好用的东西VC可没自带,怎么办呢?其实,可通过注册表,用API实现。下面说一下本人对IME的研究结果,并提供示例工程供大家参考:下载示例工程 10.6K 本文示例程序运行结果如上图1、将用到的APIRegOpenKey:打开注册表一键RegQueryValue:查询一键值RegQueryValueEx:同上RegCloseKey:关闭打开的键LoadKeyboardLayout:装载输入法ActivateKeyboardLayout:激活输入法2、IME信息在注册表中的位置在HKEY_USERS:".DEFAULT\keyboard layout\preload"放的是已安装的输入法,下有几个以数字为名的子键,内容是输入法代号(keyboard layout),如"e0040804",其中左4位是设备代码(device identifier),右4位是语言代码(language identifier)。例如上面:左e004指智能ABC,右0804指大陆中文。(详见MSDN)在HKEY_LOCAL_MACHINE:"System\CurrentControlSet\Control\Keyboard Layouts\"放的是已注册的输入法。他的子键名为输入法代号(keyboard layout),内容为该输入法的ime文件,名称等信息。 3、主要思路我们可先把已装的输入法枚举出来(从注册表),用户选择其一后,再激活该输入法。两关键函数:HKL LoadKeyboardLayout(LPCTSTR pwszKLID,UINT Flags);第一个参数是待打开的输入法代号,如"e0040804"(智能ABC);第二个参数是标志位,如KLF_ACTIVATE(激活)。HKL ActivateKeyboardLayout(HKL hkl,UINT Flags);第一个参数是打开的输入法句柄(由LoadKeyboardLayout返回);第二个参数是标志位,如KLF_SETFORPROCESS。(详见MSDN)4、例子程序新建一基于对话框的工程,加入一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,&amp;hk)==ERROR_SUCCESS)//打开键{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a[0]++;//下一子键&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str=".DEFAULT\\keyboard layout\\preload\\";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str+=a;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(::RegQueryValue(hk,NULL,lp,&amp;cp)!=ERROR_SUCCESS)//已装的输入法&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox("Error");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ::RegEnumKeyEx&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str1="System\\CurrentControlSet\\Control\\Keyboard Layouts\\";//keyboardlayoutLayout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str1+=lp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lst[i++]=lp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //打开对应的keyboardlayoutLayout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(RegOpenKey(HKEY_LOCAL_MACHINE,str1,&amp;hk1)==ERROR_SUCCESS)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; LPBYTE lpD=new BYTE[80];//DataValue&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD lpT=REG_SZ;//DataType&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; DWORD lpS=80; //DataSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(RegQueryValueEx(hk1,"Layout text",NULL,&amp;lpT,lpD,&amp;lpS)!=ERROR_SUCCESS)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; MessageBox("Query error",(LPCTSTR)lpD);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_cb1.AddString((LPCTSTR)lpD);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; delete lpD;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else MessageBox("open error");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; RegCloseKey(hk1);}::RegCloseKey(hk);m_cb1.SetCurSel(0);在OnSetfocusEdit1()加入如下代码:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CString temp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; temp=m_cb1.GetCurSel()!=CB_ERR?lst[m_cb1.GetCurSel()]:"00000409";&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; HKL hkl;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; hkl=LoadKeyboardLayout(temp,KLF_ACTIVATE);//装载输入法&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(hkl==NULL) OnOK();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ActivateKeyboardLayout(hkl,KLF_SETFORPROCESS);//激活输入法在OnSelchangeCombo1()加入如下代码:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_edt1.SetFocus();即可编译运行。5、注意:win2000下有所不同。注册表HKEY_USERS:".DEFAULT\keyboard layout\preload没有子键只有以数字为名的项,值为输入法代号(keyboard layout)。在示例代码中不仅提供了WIN 9X下的代码,也提供了2000下的相应代码段,具体请参考示例工程。<BR><BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -