初探WINDOWS下IME程式設計 (轉)
初探WINDOWS下IME程式設計 (轉)[@more@]大家知道,許多有IME屬性。這麼好用的東西VC可沒自帶,怎麼辦呢?其實,可透過登錄檔,用實現。下面說一下本人對IME的研究結果,並提供示例工程供大家參考:
示例工程 10.6K
本文示例執行結果如上圖
1、將用到的API
RegOpenKey:開啟登錄檔一鍵
RegQueryValue:查詢一鍵值
RegQueryValueEx:同上
RegCloseKey:關閉開啟的鍵
LoadKeyboardLayout:裝載輸入法
ActivateKeyboardLayout:啟用輸入法
2、IME資訊在登錄檔中的位置
在HKEY_USERS:".DEFAULTkeyboard layoutpreload"放的是已的輸入法,下有幾個以數字為名的子鍵,內容是輸入法代號(keyboard layout),如"e0040804",其中左4位是裝置程式碼(device ntifier),右4位是語言程式碼(language identifier)。例如上面:左e004指智慧ABC,右0804指大陸中文。(詳見MSDN)
在HKEY_LOCAL_MACHINE:"SystemCurrentControlSetControlKeyboard Layouts"放的是已註冊的輸入法。他的子鍵名為輸入法代號(keyboard layout),內容為該輸入法的ime,名稱等資訊。
3、主要思路
我們可先把已裝的輸入法列舉出來(從登錄檔),選擇其一後,再啟用該輸入法。
兩關鍵:
HKL LoadKeyboardLayout(LPCTSTR pwszKLID,UINT Flags);
第一個引數是待開啟的輸入法代號,如"e0040804"(智慧ABC);
第二個引數是標誌位,如KLF_ACTIVATE(啟用)。
HKL ActivateKeyboardLayout(HKL hkl,UINT Flags);
第一個引數是開啟的輸入法控制程式碼(由LoadKeyboardLayout返回);
第二個引數是標誌位,如KLF_SETFORPROCESS。(詳見MSDN)
4、例子程式
新建一基於對話方塊的工程,加入一combobox控制元件,增加控制變數m_cb1。加入一edit控制元件,增加控制變數m_edt1.對combobox,增加對CBN_SELCHANGE的對映函式OnSelchangeCombo1()。對edit1,增加對EN_SETFOCUOS的SetfocusEdit1().在對話方塊類標頭檔案的public:下加入陣列宣告:CString lst[10];
在OnInitDialog()的return前加如下程式碼: HKEY hk,hk1;
long cp=16;
char lp[15];
char a[2];
a[0]='1';
a[1]='';
CString str,str1;
str=".DEFAULTkeyboard layoutpreload";//已裝的輸入法。注:有所不同
str+=a;
int i=0;
while(::RegOpenKey(HKEY_USERS,str,&hk)==ERROR_SUCCESS)//開啟鍵
{
a[0]++;//下一子鍵
str=".DEFAULTkeyboard layoutpreload";
str+=a;
if(::RegQueryValue(hk,NULL,lp,&cp)!=ERROR_SUCCESS)//已裝的輸入法
MessageBox("Error");
::RegEnumKeyEx
str1="SystemCurrentControlSetControlKeyboard Layouts";//keyboardlayoutLayout
str1+=lp;
lst[i++]=lp;
//開啟對應的keyboardlayoutLayout
if(RegOpenKey(HKEY_LOCAL_MACHINE,str1,&hk1)==ERROR_SUCCESS)
{
LPBYTE lpD=new BYTE[80];//DataValue
D lpT=REG_SZ;//DataType
DWORD lpS=80; //DataSize
if(RegQueryValueEx(hk1,"Layout text",NULL,&lpT,lpD,&lpS)!=ERROR_SUCCESS)
MessageBox("Query error",(LPCTSTR)lpD);
m_cb1.AddString((LPCTSTR)lpD);
delete lpD;
}
else MessageBox("open error");
RegCloseKey(hk1);
}
::RegCloseKey(hk);
m_cb1.SetCurSel(0);
在OnSetfocusEdit1()加入如下程式碼: CString temp;
temp=m_cb1.GetCurSel()!=CB_ERR?lst[m_cb1.GetCurSel()]:"00000409";
HKL hkl;
hkl=LoadKeyboardLayout(temp,KLF_ACTIVATE);//裝載輸入法
if(hkl==NULL) OnOK();
ActivateKeyboardLayout(hkl,KLF_SETFORPROCESS);//啟用輸入法
在OnSelchangeCombo1()加入如下程式碼: m_edt1.SetFocus();
即可編譯執行。
5、注意:win2000下有所不同。登錄檔HKEY_USERS:".DEFAULTkeyboard layoutpreload沒有子鍵只有以數字為名的項,值為輸入法代號(keyboard layout)。在示例程式碼中不僅提供了WIN 9X下的程式碼,也提供了2000下的相應程式碼段,具體請參考示例工程。
示例工程 10.6K
本文示例執行結果如上圖
1、將用到的API
RegOpenKey:開啟登錄檔一鍵
RegQueryValue:查詢一鍵值
RegQueryValueEx:同上
RegCloseKey:關閉開啟的鍵
LoadKeyboardLayout:裝載輸入法
ActivateKeyboardLayout:啟用輸入法
2、IME資訊在登錄檔中的位置
在HKEY_USERS:".DEFAULTkeyboard layoutpreload"放的是已的輸入法,下有幾個以數字為名的子鍵,內容是輸入法代號(keyboard layout),如"e0040804",其中左4位是裝置程式碼(device ntifier),右4位是語言程式碼(language identifier)。例如上面:左e004指智慧ABC,右0804指大陸中文。(詳見MSDN)
在HKEY_LOCAL_MACHINE:"SystemCurrentControlSetControlKeyboard Layouts"放的是已註冊的輸入法。他的子鍵名為輸入法代號(keyboard layout),內容為該輸入法的ime,名稱等資訊。
3、主要思路
我們可先把已裝的輸入法列舉出來(從登錄檔),選擇其一後,再啟用該輸入法。
兩關鍵:
HKL LoadKeyboardLayout(LPCTSTR pwszKLID,UINT Flags);
第一個引數是待開啟的輸入法代號,如"e0040804"(智慧ABC);
第二個引數是標誌位,如KLF_ACTIVATE(啟用)。
HKL ActivateKeyboardLayout(HKL hkl,UINT Flags);
第一個引數是開啟的輸入法控制程式碼(由LoadKeyboardLayout返回);
第二個引數是標誌位,如KLF_SETFORPROCESS。(詳見MSDN)
4、例子程式
新建一基於對話方塊的工程,加入一combobox控制元件,增加控制變數m_cb1。加入一edit控制元件,增加控制變數m_edt1.對combobox,增加對CBN_SELCHANGE的對映函式OnSelchangeCombo1()。對edit1,增加對EN_SETFOCUOS的SetfocusEdit1().在對話方塊類標頭檔案的public:下加入陣列宣告:CString lst[10];
在OnInitDialog()的return前加如下程式碼: HKEY hk,hk1;
long cp=16;
char lp[15];
char a[2];
a[0]='1';
a[1]='';
CString str,str1;
str=".DEFAULTkeyboard layoutpreload";//已裝的輸入法。注:有所不同
str+=a;
int i=0;
while(::RegOpenKey(HKEY_USERS,str,&hk)==ERROR_SUCCESS)//開啟鍵
{
a[0]++;//下一子鍵
str=".DEFAULTkeyboard layoutpreload";
str+=a;
if(::RegQueryValue(hk,NULL,lp,&cp)!=ERROR_SUCCESS)//已裝的輸入法
MessageBox("Error");
::RegEnumKeyEx
str1="SystemCurrentControlSetControlKeyboard Layouts";//keyboardlayoutLayout
str1+=lp;
lst[i++]=lp;
//開啟對應的keyboardlayoutLayout
if(RegOpenKey(HKEY_LOCAL_MACHINE,str1,&hk1)==ERROR_SUCCESS)
{
LPBYTE lpD=new BYTE[80];//DataValue
D lpT=REG_SZ;//DataType
DWORD lpS=80; //DataSize
if(RegQueryValueEx(hk1,"Layout text",NULL,&lpT,lpD,&lpS)!=ERROR_SUCCESS)
MessageBox("Query error",(LPCTSTR)lpD);
m_cb1.AddString((LPCTSTR)lpD);
delete lpD;
}
else MessageBox("open error");
RegCloseKey(hk1);
}
::RegCloseKey(hk);
m_cb1.SetCurSel(0);
在OnSetfocusEdit1()加入如下程式碼: CString temp;
temp=m_cb1.GetCurSel()!=CB_ERR?lst[m_cb1.GetCurSel()]:"00000409";
HKL hkl;
hkl=LoadKeyboardLayout(temp,KLF_ACTIVATE);//裝載輸入法
if(hkl==NULL) OnOK();
ActivateKeyboardLayout(hkl,KLF_SETFORPROCESS);//啟用輸入法
在OnSelchangeCombo1()加入如下程式碼: m_edt1.SetFocus();
即可編譯執行。
5、注意:win2000下有所不同。登錄檔HKEY_USERS:".DEFAULTkeyboard layoutpreload沒有子鍵只有以數字為名的項,值為輸入法代號(keyboard layout)。在示例程式碼中不僅提供了WIN 9X下的程式碼,也提供了2000下的相應程式碼段,具體請參考示例工程。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-990660/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Windows 2000下的Raw Socket程式設計 (轉)Windows程式設計
- Windows下DLL程式設計技術及應用 (轉)Windows程式設計
- 初探 TypeScript 型別程式設計TypeScript型別程式設計
- Java網路程式設計初探Java程式設計
- 【Python】socket 程式設計初探Python程式設計
- WINDOWS CE 資料庫程式設計 (轉)Windows資料庫程式設計
- Windows 輸入法程式設計 (上) (轉)Windows程式設計
- 初探函數語言程式設計函數程式設計
- 函數語言程式設計初探函數程式設計
- c#網路程式設計初探C#程式設計
- Java 網路程式設計----初探ServletJava程式設計Servlet
- CSS文字:ime-mode(轉)CSS
- 《Windows 程式設計》學習筆記(五) (轉)Windows程式設計筆記
- 《Windows 程式設計》學習筆記(四) (轉)Windows程式設計筆記
- 《Windows 程式設計》學習筆記(三) (轉)Windows程式設計筆記
- 【python socket程式設計】—— 1.初探Python程式設計
- 響應式程式設計庫RxJava初探程式設計RxJava
- 對 Python Socket 程式設計的初探Python程式設計
- 函數語言程式設計初探一函數程式設計
- windows核心程式設計--程式Windows程式設計
- MFC下CSocket程式設計詳解(轉)程式設計
- Linux下的OpenGL程式設計(轉)Linux程式設計
- 設計模式初探設計模式
- 檔案下載統計php程式設計 (轉)PHP程式設計
- windows網路程式設計經典入門 (轉)Windows程式設計
- 中國程式設計師不要被Windows俘虜 (轉)程式設計師Windows
- Windows SDK程式設計之一 視窗示例程式 (轉)Windows程式設計
- Windows Shell 程式設計Windows程式設計
- Windows 程式設計簡介從C/C++到Windows程式設計Windows程式設計C++
- 貝葉斯推斷 && 概率程式設計初探程式設計
- windows核心程式設計--windows程式的執行Windows程式設計
- 轉發:Python下VTK 程式設計Python程式設計
- Linux下C語言程式設計(轉)LinuxC語言程式設計
- SMTP協議初探(二)----linux下c程式設計實現發郵件協議LinuxC程式程式設計
- windows核心程式設計--精華Windows程式設計
- Windows核心程式設計_HookWindows程式設計Hook
- windows程式設計簡介Windows程式設計
- Windows Phone 7程式設計Windows程式設計