您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > BCB > 正文
C++Builder注册表编程实例详解
[文章信息]
作者:马明臣
时间:2003-08-19
出处:yesky
责任编辑:方舟
[文章导读]
注册表中包含了系统配置、机器硬件配置、Win32 应用程序和用户的其他配置信息
advertisement
热点推荐
· 天极网软件频道改版调查
· 在ASP.NET程序中创建唯一序号
· 用JVM工具接口创建调试和分析代理
· Win 2000如何安装配置防火墙
· 防范Windows消息钩子的侵入
[正文]

上一页  1 2 3 4  

  三、注册表编程实例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下调试通过。 


上一页  1 2 3 4  

·"WAP天极之IT新闻资讯,50万元等你拿"    ·天极WAP之游戏狂图,50万元等你下载

天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 

发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容阅读排行榜
  • 主板超频特色技术GIGA技嘉篇
  • Win 2000如何安装配置防火墙
  • 防范Windows消息钩子的侵入
  • 性价比之选 AGP显卡的告别秀
  • 大学校园生活之聊天也疯狂
  • Fireworks制作GIF动画Banner
  • 金山打击外挂 遭网络游戏玩家起诉
  • 完全公测《开天》掀起滔滔巨浪
  • Advertisement