下载首页 | 资讯中心 | 下载分类 | 最近更新 | 排 行 榜 | 国产软件 | 国外软件 | 汉化补丁 |
文章搜索: 分类 关键字 收藏本站设为首页
您的位置:首页网页设计ASP程序 → Visual C++编程控制输入法__教程
Visual C++编程控制输入法__教程
日期:2007-5-15 21:08:47 人气:42     [ ]
上一页 [1] [2] 下一页
 在Windows系统中一般都安装了至少三种输入法,在输入数据时常常会切换输入法,虽然Windows系统提供了切换快捷健,但对输入工作还是带来了不少麻烦。如果在应用程序中为用户提供智能输入法自动切换,那么这样的应用程序就显得更加专业、更加具有竞争力。不知你可用过Access,在表数据输入时Access自动切换输入法,如某字段需要输入英文时自动切换到En输入状态,如另一字段需要输入中文自动切换到某中文输入状态。

  本文将对如何在Windows应用程序中动态的控制输入法的技术进行探讨。在DELPHI中许多控件都有控制输入法的属性,用户在设计时只要设置好这个属性就可以了,但在VC中并不直接提供对输入法的控制,要在VC应用中实现这种功能必须调用Windows API。在本文中我将用一个类将与输入法操作有关的Windows API函数进行封装,读者可以直接将这个类导入项目工程中,通过操作这个类来实现对输入法的控制,这样更适合于面向对象的开发。

  要想控制输入法,首先要解决的问题是如果获得系统已安装的输入法信息。在Windows平台下,每个安装的输入法都在注册表中注册了相关信息。在“HKEY_CURRENT_USER\keyboard layout\preload”键下就可以找到这些信息,键下由以1为基的递增数字做为值名(暂取名为数字号),其值的内容是一个由八个数字组成的字符串(暂取名为代号,如"e0040804"),其中左4位是设备代码(device identifier),右4位是语言代码(language identifier)。例如上面:左e004指智能ABC,右0804指大陆中文。在MSDN中对所有代码做了详细的说明,如感兴趣请浏览MSDN相关内容。另外要说明一点的是在Windows98版本中输入法注册信息与上面说明略有不同,它是将已安装的输入法的数字号做为…\Preload下面的子键,而Windows2000将数字号做为…\Preload键下的值。

   通过读取注册表中的输入法信息,可以列出所有已安装的输入法,但得到的输入法信息只是一些让人难懂的数字串,如何将这些数字串翻译成易懂的文字说明呢?同样, 在HKEY_LOCAL_MACHINE:"System\CurrentControlSet\Control\Keyboard Layouts\"键下注册了这些信息,它的子键名为输入法代号(keyboard layout),内容为该输入法的ime文件,名称等信息。到此,我们已经了解了Windows系统控制输入法的原理知识,下面我们开始着手创建一个控制输入法的C++类,主要步骤如下:

  1. 创建一个新类,新类名为:CInputLanguage

  2. 新建一个保存输入法信息的结构。当加载系统已安装的输入法信息时,用一个此结构的链表来保存输入法信息。

struct IL{
  char ilID[15]; //输入法代号。
  char szName[100];//输入法的说明文字。
  IL* pNext;
};

  3. 加入一个私有的成员变量

   IL* m_pILHead;

  4. 加入加载输入法列表信息的成员函数

//此函数只针对Windows2000以上版本,如要在Windows98版本的代码请与笔者联系。

BOOL CInputLanguage::LoadInputLanguage()
{
  HKEY hKey,hKey1;
  DWORD cp=16;
  char lp[15];
  CString szID;
  CString szKeyName,szKeyName1;
  szKeyName = "Keyboard Layout\\Preload";
  szKeyName1 = "System\\CurrentControlSet\\Control\\Keyboard Layouts\\";

  int i=1;
  szID.Format("%d",i);

  DWORD lpT=REG_SZ;
  if(::RegOpenKey(HKEY_CURRENT_USER,szKeyName,&hKey)==ERROR_SUCCESS )
  {
   While( ::RegQueryValueEx(hKey,szID,NULL,&lpT,(LPBYTE)lp,&cp) == ERROR_SUCCESS )
   {
    CString szTempName;
    szTempName = szKeyName1 + (LPCTSTR)(LPTSTR)lp;
    if(RegOpenKey(HKEY_LOCAL_MACHINE,szTempName,&hKey1)==ERROR_SUCCESS )
    {
     char lpD[100];
     DWORD lpS=100; //DataSize
     if(RegQueryValueEx(hKey1,"Layout text",NULL,&lpT,(LPBYTE)lpD,&lpS)==ERROR_SUCCESS)
     {
      IL* p1,*p2;
      p1 = m_pILHead;
      p2 = new(IL);
      strcpy(p2->ilID,lp);
      strcpy(p2->szName,lpD);
      p2->pNext = NULL;
      if( p1 )
      {
       while( p1->pNext ){ p1 = p1->pNext ; }
       p1->pNext = p2;
      }
      else
      {
       m_pILHead = p2;
      }
     }
    }
    ::RegCloseKey(hKey1);
    i++;
    szID.Format("%d",i);
   }
  }

  ::RegCloseKey(hKey);
  return (m_pILHead != NULL );

}

  5. 加入选择输入法成员函数

BOOL CInputLanguage::SelectInputLanguage(IL *pIL)

{
  if( !pIL ) return FALSE;
   HKL hkl;
   hkl=LoadKeyboardLayout(pIL->ilID,KLF_ACTIVATE);//装载输入法
   if(hkl==NULL) return FALSE;
   else{
    ActivateKeyboardLayout(hkl,KLF_SETFORPROCESS);//激活输入法
   }
   return TRUE;

}

  6. 其它部分

出处:本站原创 作者:佚名
 阅读排行
01.精美qq空间横幅代码
02.最酷qq个性女生网名
03.最新又有免费QQ秀啦《..
04.巧用透明FlaSh扮靓你的..
05.花之神匠代码(最新代码..
06.最新QQ空间免费导航
07.最新免费个人形象设置..
08.最新qq空间flash代码m..
09.CSS技术结合图像实现动..
10.Photoshop光影魔术师:..
11.QQ音速种子狂刷
12.最新QQ空间透明代码
13.PS实例教程:教你制作结..
14.Photoshop光影魔术师:..
15.制作背景图__教程
16.用Photoshop制作漂亮的..
17.如何获得QQ音速种子
18.≤QQ空间代码≥在日志..
19.网页浮动广告的制作代..
20.用Photoshop制作大红灯..
21.常用CSS
22.Photoshop给靓丽美女打..
 推荐文章
·Photoshop 表现技法之..
·快速将你的相片矢量化..
·PHOTOSHOP制作炽热的太..
·用Photoshop制作美丽的..
·流行杀手的娃娃工厂__..
·打造8号台球__教程
·PHOTOSHOP制作待机MM图..
·用Photoshop帮MM做纹身..
·PHOTOSHOP美眉着色绝招..
·PHOTOSHOP花露的制作_..
·PHOTOSHOP渐变工具的巧..
·PHOTOSHOP手绘奥兰多-..
·高难度抠图两种方法__..
·Photoshop高尔夫球的制..
·Photoshop打造精美玉佩..
Eqxia_COM下载站 版权所有 Copyright© 2001-2005 Www.eqxia.COM, All Rights Reserved.