大家知道,delphi許多控制項有ime屬性。這麼好用的東西vc可沒自帶,怎麼辦呢?其實,可通過登錄檔,用api實現。
1、將用到的api
regopenkey:開啟登錄檔一鍵
regqueryvalue:查詢一鍵值
regqueryvalueex:同上
regclosekey:關閉開啟的鍵
loadkeyboardlayout:裝載輸入法
activatekeyboardlayout:啟用輸入法
2、ime資訊在登錄檔中的位置
在hkey_users:".default\keyboard layout\preload"放的是已安裝的輸入法,下有幾個以數字為名的子鍵,內容是輸入法代號(keyboard layout),如"e0040804",其中左4位是裝置**(device identifier),右4位是語言**(language identifier)。例如上面:左e004指智慧型abc,右0804指大陸中文。(詳見msdn)
在hkey_local_machine:"system\currentcontrolset\control\keyboard 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;在onsetfocusedit1()加入如下**:long cp=16;
char lp[15];
char a[2];
a[0]='1';
a[1]='\0';
cstring str,str1;
str=".default\\keyboard layout\\preload\\";//已裝的輸入法。注:win2000有所不同
str+=a;
int i=0;
while(::regopenkey(hkey_users,str,&hk)==error_success)//開啟鍵
else messagebox("open error");
regclosekey(hk1);
}::regclosekey(hk);
m_cb1.setcursel(0);
cstring temp;在onselchangecombo1()加入如下**: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);//啟用輸入法
m_edt1.setfocus();即可編譯執行。
IME程式設計心得
二 imm ime結構的基本工作過程及特點 使用者鍵盤訊息 系統通過imm傳遞給與當前執行緒對應的ime ime根據輸入的訊息和輸入上下文中記錄的資料,將使用者的鍵盤動作轉換成結果串 以字串訊息的形式返回給imm 放到應用程式視窗的訊息佇列中。三 ime的構成 1.ime轉換介面 ime conve...
Win下的輸入法(IME)程式設計(1)
win 下的輸入法程式設計方法 在win 下編寫輸入法主要可以採用外掛程式式和 ime方式兩種 外掛程式式的實現核心是通過鍵盤鉤子對輸入進行攔截,再把要輸出的內容傳送給處於活動狀態的編輯視窗。ime 方式則是使用系統提供的 ime input method editor 介面實現輸入法。頭一種方法自...
Windows服務初探
namespace careeye 程序的主入口點 static void main servicestorun new system.serviceprocess.servicebase system.serviceprocess.servicebase.run new careeye 設計器支援...