376上位机VC MFC通过注册表获取当前全部输入法
376上位机VC MFC通过注册表获取当前全部输入法通过注册表获取全部输入法功能展示
系统中有安装有多种输入法,如果拼音,五笔,通过快捷键Ctrl+Shift等可以来回切换。但如果常用的输入法在很后面,会很麻烦,我们就想调整输入法顺序。我们当前例程通过查询注册表获取当前使用中的全部输入法,效果如图,点击按钮就可获取并显示出来,要想调整顺序,只要调整对应编码顺序就可;
要点提示
我们知道在注册表HKEY_CURRENT_USER\\keyboard \\ layout preload下有子键1、2、3、4、5(这就是输入法的顺序),每个子键的缺省键值即为标识该输入法的串值,如串值00000409对应的是英文输入法,串值E0040804对应的是智能ABC输入法。
如果想知道每一个串值对应什么输入法,我们可以在HKEY_lOCAL_MACHINE\\System\\CurrentControlSet\\Control\\Keyboard Layouts之下找到这些字符串。点击下选中对应字符串,在注册表右侧就可以找到 变量名Layout Text,其对应的变量值就是输入法的名称。
知道了输入法的存放位置及顺序关系后,我们可以利用程序操作注册表把代表输入法顺序的串值进行相应移动,即可实现我们的目的了。我们当前例程获取及显示这些输入法,具体的改顺序只要对调串值就可
实现功能
1.新建基于对话框的应用程序
2.添加列表框控件,关联变量 CListCtrl m_List;添加按钮<获取系统 当前使用输入法>关联点击函数
void CGkbc8Dlg::OnExchange()
{
m_List.DeleteAllItems();
m_nExecute = 0;
AllRegKey(HKEY_CURRENT_USER, TEXT("keyboard layout\\preload")); //获取排列,对应编码
CString sTemp,sSubKey="System\\CurrentControlSet\\Control\\Keyboard Layouts\\";
int nCount = m_List.GetItemCount();
for(int i=0;i<nCount;i++)
{
m_nExecute = i+1;
sTemp=m_List.GetItemText(i,1);
AllRegKey(HKEY_LOCAL_MACHINE,sSubKey+sTemp);
}
}
3.函数中调用了自定义的变量及函数,所以添加这此函数变量,并初始化
private:
BOOL AllRegKeyValue(HKEY hRootKey, LPCTSTR szSubKey); //遍历子键全部值
BOOL AllRegKey(HKEY hRootKey, LPCTSTR szSubKey); //遍历子键的全部子键
UINT m_nExecute;
BOOL CGkbc8Dlg::AllRegKey(HKEY hRootKey, LPCTSTR szSubKey)
{
if(!AllRegKeyValue( hRootKey, szSubKey) )
return FALSE;
HKEY hSubKey;
DWORD dwIndex = 0;
long lResult;
lResult = RegOpenKeyEx(hRootKey, szSubKey, 0, KEY_READ, &hSubKey); // 打开注册表
if(ERROR_SUCCESS == lResult)
{
TCHAR szKeyName[256] = { 0 };
DWORD cbName = 256*sizeof(TCHAR);
lResult = RegEnumKeyEx(hSubKey, dwIndex, szKeyName, &cbName, 0, NULL, NULL, NULL); // 获取字段
while (lResult == ERROR_SUCCESS)
{
AllRegKeyValue(hSubKey,szKeyName);
cbName = 256*sizeof(TCHAR);//必需重新赋值
dwIndex++;
lResult = RegEnumKeyEx(hSubKey, dwIndex, szKeyName, &cbName, 0, NULL, NULL, NULL);
}
RegCloseKey(hSubKey); // 关闭注册表
return TRUE;
}
RegCloseKey(hSubKey);
return FALSE;
}
我们来演示下功能实现的整个过程
如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|