获取输入法

获取输入法

更新日期:2010-12-23
代码下载:demo.zip (请不要使用下载工具,否则可能出错)

测试环境:VC6.0+WinXP

━━━━━━━━━━━━━━━━━━━━━━━━
以下这个操作输入法的类是网上找到的,对原作者表示感谢!


头文件:

#ifndef INPUTLANGUAGE_H
#define INPUTLANGUAGE_H
 
#include
#include

typedef struct tag_ILNode
{
       TCHAR       ilID[15];   //输入法代号
       TCHAR       szName[100];//输入法的说明文字
       tag_ILNode* pNext; 
}ILNODE,*PILNODE;
 
class CInputLanguage
{
public:
       CInputLanguage( );
       ~CInputLanguage( );
public:
    //加载系统中所有已安装输入法
       int     LoadIL( void );
    //根据输入法名称查找输入法
       PILNODE FindILByName( TCHAR* pName );
    //根据输入法代码查找输入法
       PILNODE FindILByCode( TCHAR* pCode );
    //获取当前输入当代码
       int     GetCurrentILCode( TCHAR* pCode );
       //设置当前输入法
       int     SelectIL( PILNODE pIL );
       //清空已加载输入法信息
       int     Clear( void );
private:
public:
     PILNODE m_pILHead;
};
 
#endif


源文件
#include "StdAfx.h"
#include "InputLanguage.h"
#pragma comment(lib,"advapi32.lib")

#include
using namespace std;

CInputLanguage::CInputLanguage( )
{
    m_pILHead = NULL;
}

CInputLanguage::~CInputLanguage( )
{
    Clear( );
}

int CInputLanguage::LoadIL( void )
{
    HKEY    hKey,hKey1;
    DWORD   cp=16;
    TCHAR   lp[15];
    TCHAR szKeyName[] = _T("Keyboard Layout//Preload");
    TCHAR szKeyName1[] = _T("System//CurrentControlSet//Control//Keyboard Layouts//"); 
   
   
    int i=1;
    TCHAR szID[11];
    _itot(i,szID,10);
   
    DWORD   lpT=REG_SZ;
    if(::RegOpenKey(HKEY_CURRENT_USER,szKeyName,&hKey)==ERROR_SUCCESS   )
    {
        while( ::RegQueryValueEx(hKey,szID,NULL,&lpT,(LPBYTE)lp,&cp) == ERROR_SUCCESS   )
        {
            string szTempName=szKeyName1;
            szTempName+=lp;
            if(RegOpenKey(HKEY_LOCAL_MACHINE,szTempName.c_str(),&hKey1)==ERROR_SUCCESS   )
            {
                TCHAR   lpD[100];
                DWORD   lpS=100;   //DataSize
                if(RegQueryValueEx(hKey1,_T("Layout Text"),NULL,&lpT,(LPBYTE)lpD,&lpS)==ERROR_SUCCESS)
                {
                    PILNODE   p1,p2;
                    p1   =   m_pILHead;
                    p2   =   new(ILNODE);
                    _tcscpy(p2->ilID,lp);
                    _tcscpy(p2->szName,lpD);
                    p2->pNext   =   NULL;
                    if(   p1   )
                    {
                        while(   p1->pNext   )
                        { 
                            p1   =   p1->pNext;
                        }
                        p1->pNext   =   p2;
                    }else
                    {
                        m_pILHead   =   p2;
                    }
                }
            }
            ::RegCloseKey(hKey1);
            i++;
            _itot(i,szID,10);
        }
    }
   
    ::RegCloseKey(hKey);
   
    if ( m_pILHead == NULL )
    {
        return -1;
    }else
    {
        return 0;
    }
}

int CInputLanguage::SelectIL( PILNODE pIL )
{
    if( !pIL )
    {
        return -1;
    }
    HKL hkl;
    hkl=LoadKeyboardLayout(pIL->ilID,KLF_ACTIVATE);//装载输入法 
    if( hkl==NULL )
    {
        return -2;
    }else
    {
        ActivateKeyboardLayout(hkl,KLF_SETFORPROCESS);//激活输入法
    }
   
    return 0;
}

int CInputLanguage::Clear( void )
{
    PILNODE p1,p2;
   
    p1 = m_pILHead;
    while( p1 )
    {
        p2   =   p1;
        p1   =   p1->pNext;
        delete(p2);
    }
    m_pILHead = NULL;
    return 0;
}

PILNODE CInputLanguage::FindILByName( TCHAR* pName )
{
    PILNODE p1;
   
    p1 = m_pILHead;
    while( p1 )
    {
        if ( _tcscmp( pName, p1->szName ) == 0 )
        {
            return p1;
        }
        p1 = p1->pNext;
    }
   
    return NULL;
}

PILNODE CInputLanguage::FindILByCode( TCHAR* pCode )
{
    PILNODE p1;
   
    p1 = m_pILHead;
    while( p1 )
    {
        if ( _tcscmp( pCode, p1->ilID ) == 0 )
        {
            return p1;
        }
        p1 = p1->pNext;
    }
   
    return NULL;
}

int CInputLanguage::GetCurrentILCode( TCHAR* pCode )
{
    int nRet;
   
    nRet = GetKeyboardLayoutName( pCode );
    if ( nRet != 0 )
    {
        return 0;
    }else
    {
        return -1;
    }
}


━━━━━━━━━━━━━━━━━━━━━━━━
调用示例:

枚举所有安装的输入法:
CInputLanguage input;

 input.LoadIL();

 PILNODE p=input.m_pILHead;
 while(p)
 {
  trace2( p->ilID,p->szName );
  p=p->pNext;
 }

根据输入法名称查找输入法
 CInputLanguage input;
 input.LoadIL();
 PILNODE cur=input.FindILByName("中文 - QQ拼音输入法");
 if (cur!=NULL)
 {
  }

设置当前输入法:
 CInputLanguage input;
 input.LoadIL();
 PILNODE cur=input.FindILByName("中文 - QQ拼音输入法");
 if (cur!=NULL)
 {
int rel=input.SelectIL( cur );
  }


━━━━━━━━━━━━━━━━━━━━━━━━

推荐:

谈老师的BLOG (佛教大德)
狮姐的博客(狮子窝,学佛与灵魂之探究)
大方广(学习传统文化)
慈善点击(轻松一点,行善积德,何乐不为)
电影《地球公民》(揭示不为人知的一面)  
心向光明 远离邪淫(现世警钟,不可不看)
戒淫(上篇)(正淫节欲,戒除邪淫)
戒淫(中篇)(纵欲之乐,忧患随之)
公民教育——命由我造

 

 


你可能感兴趣的:(获取输入法)