• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • Visual C++編程控制輸入法

    發表于:2007-05-25來源:作者:點擊數: 標簽:編程windows輸入法C++visual
    在 Windows 系統中一般都安裝了至少三種輸入法,在輸入數據時常常會切換輸入法,雖然 Windows系統 提供了切換快捷健,但對輸入工作還是帶來了不少麻煩。如果在應用程序中為用戶提供智能輸入法自動切換,那么這樣的應用程序就顯得更加專業、更加具有競爭力。不

      在Windows系統中一般都安裝了至少三種輸入法,在輸入數據時常常會切換輸入法,雖然Windows系統提供了切換快捷健,但對輸入工作還是帶來了不少麻煩。如果在應用程序中為用戶提供智能輸入法自動切換,那么這樣的應用程序就顯得更加專業、更加具有競爭力。不知你可用過Aclearcase/" target="_blank" >ccess,在表數據輸入時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. 其它部分

    CInputLanguage::CInputLanguage()

    {
     m_pILHead = NULL;
     LoadInputLanguage();

    }

    CInputLanguage::~CInputLanguage()

    {
     Clear();
    }

    //消除鏈表內存。

    void CInputLanguage::Clear()

    {
     IL* p1,*p2;
     p1 = m_pILHead;

     while( p1 )
     {
      p2 = p1;
      p1 = p1->pNext;
      delete(p2);
     }
     m_pILHead = NULL;

    }

    //獲得輸入法信息鏈表頭結點指針。

    IL* CInputLanguage::GetInputLanguageList()

    {
     return m_pILHead;
    }


      使用此類時,只要將其頭文件包括到要調用的文件中,調用GetInputLanguageList函數可以得到輸入法信息鏈表的頭結點指針,通過遍歷此鏈表得到所有已安裝的輸入法的信息;通過SelectInputLanguage函數可以自由的控制輸入法了

    原文轉自:http://www.kjueaiud.com

    評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)
    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>