三、注册表编程实例2—— 编写输入法调序器
通常我们使用输入法时,要按下Ctrl+空格键多次才能找到自己所熟悉的输入法,那么我们能不能把自己最常用的输入法调到英文输入法后面呢?(即只按一下Ctrl+空格即可调出自己使用的输入法)笔者经过研究,终于设计出了一个输入法调序器。它可以把当前系统中的所有输入法全部列出来,并可自由调整输入法顺序。下面笔者就把实现方法介绍给大家。
程序实现原理:
我们知道在注册表HKEY_CURRENT_USER\keyboard layout\preload下有子键1、2、3、4、5(这就是输入法的顺序),每个子键的缺省键值即为标识该输入法的串值,如串值00000409对应的是英文输入法,串值E0040804对应的是智能ABC输入法。如果想知道每一个串值对应什么输入法,我们可以在HKEY_lOCAL_MACHINE\System\CurrentControlSet\Control\Keyboard Layouts之下找到。知道了输入法的存放位置及顺序关系后,我们可以利用程序操作注册表把代表输入法顺序的串值进行相应移动,即可实现我们的目的了。
具体实现步骤:
1、新建一工程文件,在窗体上放入一个ListBox组件、三个BitBtn组件和一个Label组件。
2、在窗体的单元文件中定义全局变量如下:
AnsiString *imeStr,temStr; TRegistry *Reg1,*Reg2;//注册表对象 TRegKeyInfo keyInfo;//主键信息变量
并在单元文件前部增加包含#include <Registry.hpp>
3、在窗体的OnCreate事件过程中输入如下代码
void __fastcall TForm1::FormCreate(TObject *Sender) { Reg1=new TRegistry;//创建注册表对象 Reg2=new TRegistry; Reg1->RootKey=HKEY_CURRENT_USER;//定位注册表根键 Reg2->RootKey=HKEY_LOCAL_MACHINE; if(Reg1->OpenKey("\\keyboard layout\\preload\\",false)==true) Reg1->GetKeyInfo(keyInfo);//取得指定主键信息 ListBox1->Items->Clear(); imeStr=new AnsiString[keyInfo.NumSubKeys];//动态创建数组 for(int i=0;i<keyInfo.NumSubKeys;i++) { if(Reg1->OpenKey("\\keyboard layout\\preload\\"+IntToStr(i+1),false)==true) imeStr[i]=Reg1->ReadString("");//取得输入法串值 if(Reg2->OpenKey("\\System\\CurrentControlSet\\Control\\Keyboard Layouts\\"+imeStr[i]+"\\",false)==true) ListBox1->Items->Add(Reg2->ReadString("layout text"));//显示输入法名称 } Reg1->CloseKey(); Reg2->CloseKey(); delete Reg2; } |
4、在BitBtr1(上移按钮)的OnClick事件中加入如下代码
void __fastcall TForm1::BitBtn1Click(TObject *Sender) { int i=ListBox1->ItemIndex;//当前选择的行号 if (i>0) { ListBox1->Items->Exchange(i,i-1);//交换列表框中内两行的内容 temStr=imeStr[i];//对应串值也交换 imeStr[i]=imeStr[i-1]; imeStr[i-1]=temStr; } } |
5、类似地,在BitBun2(下移)的OnClick事件中加入如下代码
void __fastcall TForm1::BitBtn2Click(TObject *Sender) { int i=ListBox1->ItemIndex;//当前选择的行号 if (i<ListBox1->Items->Count-1) { ListBox1->Items->Exchange(i,i+1); temStr=imeStr[i];//对应串值也交换 imeStr[i]=imeStr[i+1]; imeStr[i+1]=temStr; } } |
6、在BitBtn3(确认按钮)的OnClick事件中加入如下代码
void __fastcall TForm1::BitBtn3Click(TObject *Sender) { if((Application->MessageBox("确认更改输入法顺序吗?","请确认",MB_OKCANCEL|MB_ICONWARNING))==ID_OK) { for(int i=0;i<keyInfo.NumSubKeys;i++) { Reg1->OpenKey("\\keyboard layout\\preload\\"+IntToStr(i+1),false); Reg1->WriteString("",imeStr[i]); }//给输入法重新排序 Reg1->CloseKey(); delete Reg1; delete imeStr; if((Application->MessageBox("马上要重新启动计算机","重启计算机",MB_OKCANCEL|MB_ICONWARNING))==ID_OK) ExitWindowsEx(EWX_REBOOT,0); } Close(); }
|
以上程序在Windows 98、C++ builder6.0下调试通过。
|
|