輸入法編程參考

Windows 95中文輸入法編輯器(IME)?
微軟?
翻譯:TBsoft Software Studio?
一孵稽,關(guān)于Windows 95混合語言IME?
????在Windows 95中,IME是一個(gè)動(dòng)態(tài)鏈接庫(DLL)管跺,與Windows 3.1遠(yuǎn)東版本IME不同的是一個(gè)運(yùn)行的IME相當(dāng)于混合語言鍵盤布局中的一種耻讽。與Windows 3.1 IME相比較,Windows 95混合語言IME提供下列增強(qiáng)功能:?
????●運(yùn)行時(shí)相當(dāng)于混合語言環(huán)境的一個(gè)部件?
????●為每一個(gè)應(yīng)用程序任務(wù)提供多重輸入上下文?
????●為每一個(gè)應(yīng)用程序線程提供一個(gè)活動(dòng)的IME?
????●通過應(yīng)用程序消息循環(huán)給應(yīng)用程序提供信息(消息順序不能改變)?
????●為無IME支持應(yīng)用程序和部分IME支持應(yīng)用程序提供有力的支持?
????要得到全部的增強(qiáng)功能拾积,應(yīng)用程序需要支持Windows 95 IME應(yīng)用程序I / F.?
????本文檔描述了Windows 95 IME體系結(jié)構(gòu)的應(yīng)用程序I / F颇玷。

1,IME的結(jié)構(gòu)?
????Windows 95 IME必須提供兩個(gè)部件:IME轉(zhuǎn)換接口和IME用戶接口.IME轉(zhuǎn)換接口由一組IME模塊引出函數(shù)提供荠医,這些函數(shù)被IMM(輸入法管理器 - 譯者注)調(diào)用。?
????IME用戶接口由一組窗口提供桑涎,這些窗口接收消息并提供IME的用戶界面

.2彬向,IME支持應(yīng)用程序(IME)?
????:?
支持應(yīng)用程序應(yīng)用程序接受DBCS字符,用戶可以通過IME在應(yīng)用程序中輸入DBCS字符攻冷。?
●部分IME支持應(yīng)用程序:這種應(yīng)用程序只控制不同的IME上下文娃胆,打開例如
●關(guān)于輸入法,寫作窗口等等等曼,但是不重新顯示任何IME用戶界面●完成IME支持應(yīng)用程序里烦。這種應(yīng)用程序負(fù)責(zé)管理通過IME顯示給應(yīng)用程序的任何信息。?
????在Windows 95中禁谦,一個(gè)無IME應(yīng)用程序有一個(gè)缺省的IME窗口和一個(gè)缺省的輸入上下文胁黑。?
????部分IME支持應(yīng)用程序使用預(yù)定義“IME”類創(chuàng)建自己的IME窗口,可以管理或者不管理自己的輸入上下文州泊。?
????完全I(xiàn)ME支持應(yīng)用程 自己管理輸入上下文丧蘸,顯示輸入上下文給出的任何需要的信息,不使用IME窗口遥皂。
二力喷,IME用戶?
????界面包括IME窗口刽漂,用戶界面(UI)窗口以及UI窗口的部件

0.1,特征?
????IME類是實(shí)現(xiàn)IME用戶界面部分的預(yù)定義全局窗口類冗懦∷幔“IME”類與預(yù)定義的公共控制窗口類有許多相同的特點(diǎn)仇祭,IME窗口實(shí)例與靜態(tài)控制一樣通過CreateWindowEx函數(shù)創(chuàng)建披蕉,IME類窗口自己不響應(yīng)用戶輸入,取而代之的是接收不同類型的控制消息實(shí)現(xiàn)全部IME用戶接口乌奇。應(yīng)用程序可以使用IME類創(chuàng)建自己的IME窗口没讲,還可以使用ImmGetDefaultIMEWnd函數(shù)獲取缺省IME窗口。創(chuàng)建自己的IME窗口或者使用缺省IME窗口的應(yīng)用程序被稱為IME支持應(yīng)用程序礁苗,具有以下優(yōu)點(diǎn)(與對應(yīng)的Windows3.1應(yīng)用程序比較):

●包括候選字表窗口(候選窗口)爬凑,每個(gè)應(yīng)用程序可以有自己的用戶界面窗口實(shí)例,使得用戶可以在任何輸入過程的中途停止并切換到另一個(gè)應(yīng)用程序试伙。在Windows 3.1中嘁信,用戶切換到另一個(gè)應(yīng)用程序是必須放棄當(dāng)前輸入過程。?
因?yàn)镮ME用戶界面窗口包括應(yīng)用程序窗口句柄疏叨,IM?用戶界面口可 為應(yīng)用程序提供缺省行為潘靖。例如當(dāng)應(yīng)用程序移動(dòng)時(shí)IME用戶界面窗口自動(dòng)移動(dòng),自動(dòng)跟隨窗口中的插入符號(hào)位置蚤蔓,為每一個(gè)應(yīng)用程序標(biāo)示模式等等卦溢。?
????即使系統(tǒng)僅僅只提供一個(gè)IME類,IME窗口仍然有兩種類型秀又。一種類型是系統(tǒng)為無IME支持應(yīng)用程序創(chuàng)建的IME窗口单寂,DefWindowProc函數(shù)函數(shù)函數(shù)函數(shù)為該窗口處理消息,DefWindowProc函數(shù)函數(shù)函數(shù)函數(shù)的IME用戶接口被線程的所有無IME支持窗口共享吐辙,在文檔中宣决,這種窗口稱為缺省IME窗口。另一種類型是IME支持應(yīng)用程序創(chuàng)建的IME窗口昏苏,在文檔中尊沸,IME支持應(yīng)用程序創(chuàng)建的IME窗口稱作應(yīng)用程序IME窗口。

2捷雕,缺省和應(yīng)用程序IME窗口當(dāng)前程序初始化?
????時(shí)系統(tǒng) - - 創(chuàng)建不存在IME窗口椒丧,這就是說,線程自動(dòng)獲取不足IME窗口為無IME支持應(yīng)用程序提供IME用戶界面救巷,當(dāng)IME或者IMM生成一個(gè)IME消息(WM_IME_ *)時(shí)壶熏,無IME支持應(yīng)用程序傳遞該消息到DefWindowProc函數(shù)函數(shù),DefWindowProc函數(shù)函數(shù)發(fā)送需要的消息到為應(yīng)用程序提供IME用戶界面的不足

IME 窗口.IME IME類?
????IME類是Windows 95的遠(yuǎn)東版本預(yù)定義的窗口類浦译,就像編輯是預(yù)使用IME窗口棒假,定義的窗口類一樣溯职。預(yù)定義的IME類實(shí)現(xiàn)全部的IME用戶接口,處理所有來自IME和包含IMM函數(shù)的應(yīng)用程序的消息帽哑,應(yīng)用程序使用IME類創(chuàng)建自己的IME窗口谜酒。系統(tǒng)IME類不能被任何IME替換。?
????窗口過程與IME類通過WM_IME_SELECT消息交互妻枕,該消息包括新選中的IME的鍵盤布局僻族,輸入法類使用鍵盤布局查找到每個(gè)IME定義的類名。使用類名屡谐,IME類為當(dāng)前活動(dòng)的IME創(chuàng)建IME 戶界面窗口述么。

4,IME UI類?
????每個(gè)IME都必須向系統(tǒng)注冊自己的用戶界面(UI)類愕掏,UI類提供IME相關(guān)功能度秘。當(dāng)IME在自己的UI類中注冊時(shí),這就是說饵撑,當(dāng)DLLEntry函數(shù)被調(diào)用DLL_PROCESS_ATTACH功能時(shí)剑梳,IME必須在對ImeInquire函數(shù)的調(diào)用過程中指定UI類名.UI類應(yīng)用使用CS_IME窗口風(fēng)格注冊以使得每個(gè)應(yīng)用程序都可以使用UI類?
????.UI類名(包括空終結(jié)符)可以使用16位的TCHAR字符,這個(gè)限制可能延遲到視窗的未來版本滑潘。?
????當(dāng)注冊一個(gè)UI類時(shí)垢乙,應(yīng)該指定8個(gè)字節(jié)的窗口附加數(shù)據(jù)(這就是說,設(shè)置WNDCLASSEX類的cbWndExtra成員的值為2 * sizeof LONG ))众羡,系統(tǒng)使用該窗口附加數(shù)據(jù)?
????.IME可以在應(yīng)用程序執(zhí)行任務(wù)時(shí)注冊任何類和創(chuàng)建任何窗口侨赡。

????下面的實(shí)例顯示了怎樣注冊IME窗口類:

友元類運(yùn)算符{180905}重載實(shí)現(xiàn)


BOOL WINAPI DLLEntry(HINSTANCE hInstDLL,DWORD dwFunction粱侣,LPVOID lpNot)?
{
????開關(guān)(dwFunction)?
??????{
????????情況下DLL_PROCESS_ATTACH:?
????????HINST = hInstDLL;?
????????wc.style = CS_MYCLASSFLAG | CS_IME;?
????????wc.lpfnWndProc = MyUIServerWndProc;?
????????wc.cbClsExtra = 0;?
????????wc.cbWndExtra = 2 * sizeof(LONG);?
????????wc.hInstance = hInst;?
????????wc.hCursor = LoadCursor(NULL羊壹,IDC_ARROW);?
????????wc.hIcon = NULL;?
????????wc.lpszMenuName =(LPSTR)NULL;?
????????wc.lpszClassName =(LPSTR)szUIClassName;?
????????wc.hbrBackground = NULL;?
????????如果(!RegisterClass((LPWNDCLASS)&wc))?
????????返回FALSE;?
????????wc.style = CS_MYCLASSFLAG | CS_IME;?
????????wc.lpfnWndProc = MyCompStringWndProc;?
????????wc.cbClsExtra = 0;?
????????wc.cbWndExtra = cbMyWndExtra;?
????????wc.hInstance = hInst;?
????????wc.hCursor = LoadCursor(NULL齐婴,IDC_ARROW);?
????????wc.hIcon = NULL;?
????????wc.lpszMenuName =(LPSTR)NULL;?
????????wc.lpszClassName =(LPSTR)szUICompStringClassName;?
????????wc.hbrBackground = NULL;?
????????如果(油猫!RegisterClass((LPWNDCLASS)&wc))?
????????返回FALSE;?
????????打破;?
????????case DLL_PROCESS_DETACH:?
????????UnregisterClass(s?? zUIClassName,hInst);?
????????UnregisterClass(S zUICompStringClassName柠偶,HINST);?
????????打破;?
?????}?
???返回TRUE;?
}

我就是[C] 170914 [/ C]驗(yàn)證怎么了

5情妖、UI窗口?
????IME類對應(yīng)的IME窗口被應(yīng)用程序或者系統(tǒng)創(chuàng)建,當(dāng)IME窗口被創(chuàng)建時(shí)诱担,IME自身提供的UI窗口被創(chuàng)建并被IME窗口所擁有毡证。每一個(gè)UI窗口有一個(gè)當(dāng)前的輸入上下文,當(dāng)UI窗口接收到IME消息(WM_IME_*)時(shí)蔫仙,可以通過調(diào)用GetWindowLong函數(shù)和指定IMMGWL_IMC索引值查找到輸入上下文料睛,UI窗口可以根據(jù)輸入上下文處理消息,UI窗口可以在除響應(yīng)WM_CREATE消息以外的任何時(shí)間查找到輸入上下文。?
????IME不允許改變UI窗口的窗口附加數(shù)據(jù)恤煞,如果UI窗口的某個(gè)實(shí)例需要窗口附加數(shù)據(jù)屎勘,可以使用IMMGWL_PRIVATE參數(shù)值調(diào)用SetWindowLong和GetWindowLong函數(shù),IMMGWL_PRIVATE參數(shù)值提供為UI窗口的某個(gè)實(shí)例存取附加數(shù)據(jù)中LONG類型值的能力居扒,如果需要大于LONG類型值的附加數(shù)據(jù)概漱,可以保存一個(gè)內(nèi)存塊的句柄到IMMGWL_PRIVATE域。?
????UI窗口過程可以使用DefWindowProc函數(shù)喜喂,但是UI窗口不允許傳遞IME消息給DefWindowProc函數(shù)瓤摧,即使某個(gè)IME消息沒有被處理,UI窗口也不允許傳遞該消息給DefWindowProc函數(shù)夜惭。?
LRESULT UIWndProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)?
{
HIMC hIMC;?
HGLOBAL hMyExtra;?
switch(msg){
case WM_CREATE:?
// Allocate the memory bloack for the window instance.?
hMyExtra = GlobalAlloc(GHND,size_of_MyExtra);?
if (!hMyExtra)?
MyError();?
// Set the memory handle into IMMGWL_PRIVATE?
SetWindowLong(hWnd, IMMGWL_PRIVATE, (LONG)hMyExtra);?
.?
.?
.?
break;?
case WM_IME_xxxx:?
// Get IMC;?
hIMC = GetWindowLong(hWnd,IMMGWL_IMC);?
// Get the memory handle for the window instance.?
hMyExtra = GetWindowLong(hWnd, IMMGWL_PRIVATE);?
lpMyExtra = GlobalLock(hMyExtra);?
.?
.?
.?
GlobalUnlock(hMyExtra);?
break;?
.?
.?
.?
case WM_DESTROY:?
// Get the memory handle for the window instance.?
hMyExtra = GetWindowLong(hWnd, IMMGWL_PRIVATE);?
// Free the memory block for the window instance.?
GlobalFree(hMyExtra);?
break;?
default:?
return DefWindowProc(hWnd, msg, wParam, lParam);?
}?
}?
????UI窗口必須在當(dāng)前選定的輸入上下文中執(zhí)行動(dòng)作姻灶,當(dāng)一個(gè)窗口被激活時(shí),UI窗口接收到提供當(dāng)前輸入上下文的消息诈茧,此后,UI窗口運(yùn)行在當(dāng)前選中的輸入上下文上捂掰。輸入上下文必須包括UI窗口顯示寫作窗口敢会、狀態(tài)窗口等需要的所有信息。?
????UI窗口要求輸入上下文这嚣,但是窗口不必自己更新輸入上下文鸥昏。當(dāng)UI窗口需要更新輸入上下文時(shí),應(yīng)該調(diào)用IMM函數(shù)姐帚,因?yàn)檩斎肷舷挛挠蒊MM函數(shù)管理吏垮,當(dāng)輸入上下文更新時(shí),IMM和IME接收到通知消息罐旗。?
????例如膳汪,有時(shí)UI窗口當(dāng)鼠標(biāo)單擊時(shí)需要改變輸入上下文的轉(zhuǎn)換模式,為了設(shè)置轉(zhuǎn)換模式九秀,UI窗口調(diào)用ImmSetConversionMode函數(shù)遗嗽,該函數(shù)為NotifyIME生成一個(gè)通知消息并發(fā)送WM_IME_NOTIFY消息到UI窗口,如果UI窗口改變轉(zhuǎn)換模式的顯示鼓蜒,UI窗口會(huì)等待處理WM_IME_NOTIFY消息痹换。

6、UI窗口的部件?
????UI窗口可以根據(jù)輸入上下文注冊和顯示寫作窗口和狀態(tài)窗口都弹,UI窗口的部件類的窗口風(fēng)格必須包括CS_IME娇豫。UI窗口的一個(gè)窗口實(shí)例從當(dāng)前輸入上下文接收例如寫作字符串、字體畅厢、位置等信息冯痢,當(dāng)應(yīng)用程序的一個(gè)窗口獲得焦點(diǎn)時(shí),系統(tǒng)獲取該窗口自己的輸入上下文并將當(dāng)前輸入上下文傳遞給UI窗口,系統(tǒng)發(fā)送WM_IME_SETCONTEXT消息和輸入上下文的句柄給應(yīng)用程序系羞,應(yīng)用程序傳遞該消息給UI窗口郭计。如果當(dāng)前輸入上下文被更新,UI窗口應(yīng)該重新繪制寫作窗口椒振,無論何時(shí)輸入上下文改變昭伸,UI窗口都應(yīng)該顯示正確的寫作窗口,可以保證IME的狀態(tài)澎迎。?
????UI窗口可以創(chuàng)建子窗口或者彈出式窗口顯示狀態(tài)庐杨、寫作字符串或者候選字列表,這些窗口必須是UI窗口的附屬窗口夹供,而且必須創(chuàng)建為不可接收輸入(Disable)窗口灵份,任何IME創(chuàng)建的窗口都不應(yīng)該獲取焦點(diǎn)。

三哮洽、輸入上

如果無法打開{https://www.lanzous.com/i1t4ywf}這里下載就行了


1填渠、缺省輸入上下文?
????缺省情況下系統(tǒng)給每個(gè)線程一個(gè)輸入上下文,該輸入上下文被線程的所有無IME支持窗口共享鸟辅。

2氛什、輸入上下文與窗口的交互?
????應(yīng)用程序的一個(gè)窗口可以使用窗口句柄與輸入上下文交互以維護(hù)任何IME狀態(tài),包括中間寫作字符串匪凉。一旦應(yīng)用程序使得輸入上下文與窗口句柄交互枪眉,無論何時(shí)窗口被激活,系統(tǒng)自動(dòng)選中輸入上下文再层。使用這個(gè)特點(diǎn)贸铜,應(yīng)用程序可以輕松地完成Windows 3.1下必須的復(fù)雜切換處理。

3聂受、使用輸入上下文?
????當(dāng)應(yīng)用程序或者系統(tǒng)創(chuàng)建新的輸入上下文時(shí)蒿秦,系統(tǒng)準(zhǔn)備新的輸入上下文,新的輸入上下文已經(jīng)包括IMCC饺饭,這個(gè)IMC的部件由hCompStr渤早、hCandInfo、hGuideLine瘫俊、hPrivate和hMsgBuf組成鹊杖。IME基本上不需要?jiǎng)?chuàng)建輸入上下文和輸入上下文的部件,不過IME可以改變它們的大小扛芽,可以通過鎖定它們查找到部件的指針骂蓖。?
 
⑴存取HIMC?
????為了存取輸入上下文,IME必須調(diào)用ImmLockIMC函數(shù)以查找到輸入上下文的指針川尖,ImmLockIMC函數(shù)給IMC增加imm鎖定計(jì)數(shù)登下,ImmUnlockIMC函數(shù)減少之。

⑵存取HIMCC?
????為了存取輸入上下文中的一個(gè)部件,IME必須調(diào)用ImmLockIMCC函數(shù)獲取IMCC的指針被芳,ImmLockIMCC函數(shù)給IMCC增加imm鎖定計(jì)數(shù)缰贝,ImmUnlockIMCC函數(shù)減少之,ImmReSizeIMCC函數(shù)可以修改IMCC的大小以指定新的大小畔濒。?
????某些情況下剩晴,IME可能需要自己創(chuàng)建輸入上下文的一個(gè)部件,這種情況下侵状,IME可以調(diào)用ImmCreateIMCC函數(shù)獲取IMCC的句柄赞弥,這個(gè)IMCC可以是INPUTCONTEXT結(jié)構(gòu)的成員(hCompStr、hCandInfo趣兄、hGuideLine绽左、hPrivate或者h(yuǎn)MsgBuf)。?
????ImmDestroyIMCC清除輸入上下文的一個(gè)部件艇潭。

⑶怎樣使用輸入上下文?
????下面的實(shí)例顯示了怎樣使用輸入上下文?
LPINPUTCONTEXT lpIMC;?
LPCOMOSITIONSTRING lpCompStr;?
HIMCC hMyCompStr;?
if (hIMC) {// It is not NULL context.?
lpIMC = ImmLockIMC(hIMC);?
if (!lpIMC) {
MyError( "Can not lock hIMC");?
return FALSE;?
}?
// Use lpIMC->hCompStr.?
lpCompStr = (LPCOMPOSITIONSTRING) ImmLockIMCC(lpIMC->hCompStr);?
// Access lpCompStr.?
ImmUnlockIMCC(lpIMC->hCompStr);?
// ReSize lpIMC->hCompStr.?
if (!(hMyCompStr = ImmReSizeIMCC(lpIMC->hCompStr,dwNewSize)) {
MyError("Can not resize hCompStr");?
ImmUnlockIMC(hIMC);?
return FALSE;?
}?
lpIMC->hCompStr = hMyCompStr;?
ImmUnlockIMC(hIMC);?
}

四拼窥、生成消息?
????IME需要生成IME消息。當(dāng)IME開始轉(zhuǎn)換時(shí)暴区,IME必須生成WM_IME_STARTCOMPOSITION消息闯团,如果IME改變了寫作字符串,IME必須生成WM_IME_COMPOSITION消息仙粱,IME引發(fā)的事件導(dǎo)致生成消息給與輸入上下文進(jìn)行交互的窗口。IME基本上使用ImeToAsciiEx函數(shù)參數(shù)提供的lpdwTransKey緩沖區(qū)生成消息彻舰,當(dāng)ImeToAsciiEx函數(shù)被調(diào)用時(shí)IME存儲(chǔ)消息到lpdwTransKey緩沖區(qū)中伐割,不過即使ImeToAsciiEx函數(shù)沒有?
被調(diào)用,IME也可以生成消息給使用輸入上下文的消息緩沖區(qū)與輸入上下文交互的窗口刃唤。輸入上下文有一個(gè)內(nèi)存塊的句柄作為消息緩沖區(qū)隔心,IME存儲(chǔ)消息到被消息緩沖區(qū)句柄提供的內(nèi)存塊中,以后IME調(diào)用ImmGenerateMessage函數(shù)尚胞,ImmGenerateMessage函數(shù)發(fā)送保存在消息緩沖區(qū)中的消息到適當(dāng)?shù)拇翱凇?br>
1硬霍、在ImeToAsciiEx函數(shù)中使用消息緩沖區(qū)?
????下面的實(shí)例顯示了怎樣通過傳遞緩沖區(qū)到ImeToAsciiEx函數(shù)生成消息:?
UINT ImeToAsciiEx(uVirKey, uScanCode, lpbKeyState, lpdwTransBuf,?
fuState , hIMC )?
{
DWORD dwMyNumMsg = 0;?
.?
.?
.?
// Set the messages that the IME needs to generate.?
*lpdwTransBuf++ = (DWORD) msg;?
*lpdwTransBuf++ = (DWORD) wParam;?
*lpdwTransBuf++ = (DWORD) lParam;?
// Count the number of the messages that the IME needs to generate.?
dwMyNumMsg++;?
.?
.?
.?
return dwMyNumMsg;?
}?
????系統(tǒng)提供lpdwTransBuf參數(shù)指定的緩沖區(qū),IMEToAsciiEx函數(shù)可以一次存儲(chǔ)所有的消息到該緩沖區(qū)中笼裳,緩沖區(qū)的第一個(gè)雙字給出存儲(chǔ)在緩沖區(qū)中的消息個(gè)數(shù)唯卖。如果ImeToAsciiEx函數(shù)需要生成比這個(gè)給定的個(gè)數(shù)更多的消息,函數(shù)可以存儲(chǔ)所有的消息到輸入上下文的hMsgBuf域中躬柬,然后函數(shù)ImeToAsciiEx返回消息個(gè)數(shù)拜轨。當(dāng)ImeToAsciiEx函數(shù)的返回值大于lpdwTransBuf中指定的值時(shí),系統(tǒng)不從lpdwTransBuf中取出消息允青,系統(tǒng)查找作為ImeToAsciiEx函數(shù)參數(shù)傳遞的輸入上下文中的hMsgBuf域橄碾。

2、使用消息緩沖區(qū)?
????下面的實(shí)例顯示了怎樣使用消息緩沖區(qū):?
MyGenerateMesage(HIMC hIMC, UINT msg, WPARAM wParam, LPARAMlParam)?
{
LPINPUTCONTEXT lpIMC;?
HGLOBAL hTemp;?
LPDWORD lpdwMsgBuf;?
DWORD dwMyNumMsg = 1;?
// Lock the input context.?
lpIMC = ImmLockIMC(hIMC);?
if (!lpIMC)?
// Error!?
// re-allocate the memory bloack for the message buffer.?
hTemp = ImmReSizeIMCC(lpIMC->hMsgBuf,?
(lpIMC->dwNumMsgBuf + dwMyNumMsg) * sizeof(DWORD) * 3);?
if (!hTemp)?
// Error!?
lpIMC->hMsgBuf = hTemp;?
// Lock the memory for the message buffer.?
lpdwMsgBuf = ImmLockIMCC(lpIMC->hMsgBuf);?
if (!lpdwMsgBuf)?
// Error!?
lpdwNumMsgBuf += 3 * lpIMC->dwNumMsgBuf.?
// Set the number of the messages.?
lpIMC->dwNumMsgBuf += dwMyNumMsg;?
// Set the messages that the IME needs to generate.?
*lpdwMsgBuf++ = (DWORD) msg;?
*lpdwMsgBuf++ = (DWORD) wParam;?
*lpdwMsgBuf++ = (DWORD) lParam;?
// Unlock the memory for the message buffer and the input context.?
ImmUnlockIMCC(lpIMC->hMsgBuf);?
ImmLockIMC(hIMC);?
// Call ImmGenerateMessage function.?
ImmGenerateMessage(hIMC);?
}

3、WM_IME_COMPOSITION消息?
????當(dāng)IME生成WM_IME_COMPOSITION消息時(shí)法牲,IME指定lParam參數(shù)為GCS位史汗。GCS位的意義是COMPOSITIONSTRING結(jié)構(gòu)中的有效成員,即使IME沒有更新拒垃,成員目前仍然有效停撞,IME也會(huì)設(shè)置GCS位。?
????為IME定義服務(wù)?
????當(dāng)IME生成WM_IME_COMPOSITION消息時(shí)恶复,IME可能會(huì)立刻改變字符串怜森、屬性以及子句信息。IME使用下列定義:?
GCS_COMP?
GCS_COMPREAD?
GCS_RESULT?
GCS_RESULTREAD

五谤牡、關(guān)于ImeSetCompositionString函數(shù)

1副硅、ImeSetCompositionString函數(shù)能力?
????如果IME沒有ImeSetCompositionString函數(shù)能力,IME將不能在IMEINFO結(jié)構(gòu)中指定任何SCS能力翅萤。如果IME可以處理ImeSetCompositionString函數(shù)恐疲,IME設(shè)置SCS_COMPSTR位。如果IME可以通過寫作字符串生成解釋(本文中的“解釋”是單詞“reading”的直譯套么,真正意義可能是“原始輸入的”培己,例如輸入的漢語拼音字母字符串,下同)字符串胚泌,IME可以設(shè)置SCS_CAP_MAKEREAD位省咨。?
????如果IME有SCS_CAP_COMPSTR能力,ImeSetCompositionString函數(shù)將被調(diào)用玷室,IME從應(yīng)用程序獲取新的寫作字符串并生成WM_IME_COMPOSITION消息零蓉。?
????如果IME有SCS_CAP_MAKEREAD能力,IME可以通過寫作字符串建立解釋字符串穷缤。

2敌蜂、關(guān)于SCS_SETSTR?
????如果ImeSetCompositionString函數(shù)的dwIndex參數(shù)值為SCS_SETSTR,IME可以清除hIMC中的COMPOSITIONSTR結(jié)構(gòu)中所有的域津肛。?
如果IME需要章喉,IME可以更新候選信息并生成候選消息IMN_OPENCANDIDATE、IMN_CHANGECANDIDATE或者IMN_CLOSECANDIDATE身坐。?
????如果ImeSetCompositionString函數(shù)的lpRead參數(shù)有效秸脱,IME應(yīng)該通過lpRead參數(shù)中的解釋字符串建立寫作字符串,另外IME為新的寫作字符串和lpRead參數(shù)中的解釋字符串建立屬性和子句信息掀亥,IME生成lParam參數(shù)為(GCS_COMP|GCS_COMPREAD)的WM_IME_COMPOSITION消息撞反。有時(shí)IME需要自動(dòng)確定建立上述信息,這種情況下搪花,IME可以生成lParam參數(shù)以(GCS_RESULT|GCS_RESULTREAD)代替GCS_COMPxxx的消息遏片。?
????如果ImeSetCompositionString函數(shù)的lpComp參數(shù)有效嘹害,IME應(yīng)該通過lpComp參數(shù)中的寫作字符串建立寫作屬性和子句信息,IME生成lParam參數(shù)為GCS_COMP的WM_IME_COMPOSITON消息吮便。如果IME有SCS_CAP_MAKEREAD能力笔呀,IME應(yīng)該同時(shí)建立解釋字符串,IME生成lParam參數(shù)為(GCS_COMP|GCS_COMPREAD)的WM_IME_COMPOSITION消息髓需。有時(shí)IME需要自動(dòng)確定建立上述信息许师,這種情況下,IME可以生成lParam參數(shù)以(GCS_RESULT|GCS_RESULTREAD)代替GCS_COMPxxx的消息僚匆。?
????如果lpRead參數(shù)和lpComp參數(shù)同時(shí)有效微渠,IME應(yīng)該建立寫作字符串和解釋字符串,這時(shí)IME不需要完全按照lpRead參數(shù)和lpComp參數(shù)咧擂。如果IME不能建立應(yīng)用程序指定的lpRead參數(shù)和lpComp參數(shù)之間的關(guān)系逞盆,IME應(yīng)該修正寫作字符串,IME為新的寫作字符串和lpRead參數(shù)指定的解釋字符串建立屬性和子句信息松申,IME生成lParam參數(shù)為(GCS_COMP|GCS_COMPREAD)的WM_IME_COMPOSITION消息云芦。有時(shí)IME需要自動(dòng)完成建立上述信息,這種情況下贸桶,IME可以生成lParam參數(shù)以(GCS_RESULT|GCS_RESULTREAD)代替GCS_COMPxxx的消息舅逸。

3、關(guān)于SCS_CHANGEATTR?
????SCS_CHANGEATTR只影響屬性信息皇筛,IME不應(yīng)該更新寫作字符串琉历、寫作字符串的子句信息、寫作字符串的解釋以及寫作字符串的解釋子句信息水醋。?
首先IME檢查新的屬性并判斷新的屬性是否可用善已,然后IME設(shè)置屬性到hIMC中的COMPOSITIONSTRING結(jié)構(gòu)中,最后IME生成WM_IME_COMPOSITION消息离例。?
????如果需要,IME可以更新候選信息并生成候選消息IMN_OPENCANDIDATE悉稠、IMN_CHANGECANDIDATA宫蛆、IMN_CLOSECANDIDATE。IME不能確定寫作字符串的猛。?
????如果ImeSetCompositionString函數(shù)的lpRead參數(shù)有效耀盗,IME使用lpRead參數(shù)中的新屬性。IME也應(yīng)該為當(dāng)前寫作字符串建立寫作字符串的新屬性卦尊,這時(shí)子句信息不被修改叛拷。?
????寫作字符串、屬性岂却、子句信息忿薇、解釋字符串裙椭、解釋屬性和解釋子句信息必須有效。IME生成lParam參數(shù)為(GCS_COMP|GCS_COMPREAD)的WM_IME_COMPOSITION消息署浩,如果IME不能接受lpComp參數(shù)中的新屬性揉燃,IME不需要生成任何消息并返回FALSE。?
????如果ImeSetCompositionString函數(shù)的lpComp參數(shù)有效筋栋,IME使用lpComp參數(shù)中的新屬性炊汤,這時(shí)子句信息不被修改。?
????如果IME有SCS_CAP_MAKEREAD能力弊攘,并且解釋字符串有效抢腐,IME應(yīng)該為當(dāng)前寫作字符串的解釋建立寫作字符串的解釋的新屬性。?
????如果lpRead參數(shù)和lpComp參數(shù)同時(shí)有效襟交,并且如果IME能夠接受新的信息迈倍,IME設(shè)置新的信息到hIMC中的COMPOSITION結(jié)構(gòu)中并生成lParam參數(shù)為(GCS_COMP|GCS_COMPREAD)的WM_IME_COMPOSITION消息。

4婿着、關(guān)于SCS_CHANGECLAUSE?
????SCS_CHANGECLAUSE影響寫作字符串和寫作字符串的解釋的字符串和屬性授瘦。?
????如果需要,IME可以更新候選信息并生成候選消息IMN_OPENCANDIDATE竟宋、IMN_CHANGECANDIDATA提完、IMN_CLOSECANDIDATE。IME不能確定寫作字符串丘侠。?
????如果ImeSetCompositionString函數(shù)的lpRead參數(shù)有效徒欣,IME使用lpRead參數(shù)中的解釋子句信息。IME必須修正寫作字符串的解釋的屬性蜗字,IME可以更新寫作字符串打肝、屬性和寫作字符串的子句信息,IME生成lParam參數(shù)為(GCS_COMP|GCS_COMPREAD)的WM_IME_COMPOSITION消息挪捕。?
????如果ImeSetCompositionString函數(shù)的lpComp參數(shù)有效粗梭,IME使用新的子句信息。IME必須修正寫作字符串和寫作字符串的屬性级零,IME可以更新解釋屬性和解釋的子句信息断医,IME生成lParam參數(shù)為(GCS_COMP|GCS_COMPREAD)的WM_IME_COMPOSITION消息。?
????如果lpRead參數(shù)和lpComp參數(shù)同時(shí)有效奏纪,并且如果IME能夠接受新的信息鉴嗤,IME設(shè)置新的信息到hIMC中的COMPOSITION結(jié)構(gòu)中并生成lParam參數(shù)為(GCS_COMP|GCS_COMPREAD)的WM_IME_COMPOSITION消息。

六序调、軟鍵盤

1醉锅、關(guān)于軟鍵盤?
????一些IME有特殊的解釋字符,例如一個(gè)IME可能使用注音符號(hào)作為解釋字符(這里指臺(tái)灣中文版Windows 95发绢,即CWin95中的注音符號(hào)硬耍,PWin95中可能指漢語拼音字母或者音調(diào)符號(hào)――譯者注)垄琐,另一個(gè)IME使用了一些字根符號(hào)(原文單詞是“radials”,但實(shí)際可能是“radicals”――譯者注)作為解釋字符默垄,IME可以提供一個(gè)軟鍵盤顯示這些特殊解釋字符使得用戶不必逐鍵記憶解釋字符此虑。?
????IME需要根據(jù)不同的變換狀態(tài)改變鍵表示的解釋字符,使用軟鍵盤可以通知用戶鍵的改變口锭。在選擇候選字時(shí)朦前,IME可以只顯示那些選擇鍵給用戶。

2鹃操、使用軟鍵盤?
????IME可能需要為軟鍵盤創(chuàng)建一個(gè)更好的用戶界面韭寸,或者可能需要系統(tǒng)預(yù)定義的軟鍵盤,如果IME需要使用系統(tǒng)預(yù)定義的軟鍵盤荆隘,IME需要在調(diào)用ImeInquire函數(shù)時(shí)將IMEINFO結(jié)構(gòu)的fdwUICaps成員指定為UI_CAP_SOFTKBD恩伺。?
????IME可以調(diào)用ImmCreateSoftKeyboard函數(shù)為軟鍵盤創(chuàng)建窗口,還可以調(diào)用ImmShowSoftKeyboard函數(shù)顯示或者隱藏軟鍵盤椰拒。軟鍵盤窗口是UI窗口的一個(gè)組件晶渠,所以軟鍵盤窗口應(yīng)該附屬于UI窗口。?
????IME可能需要決定是否在無論何時(shí)焦點(diǎn)移走的情況下刪除窗口燃观,軟鍵盤可能占有一些系統(tǒng)資源(可能需要釋放――譯者注)?
????軟鍵盤有不同的類型褒脯,一種類型可能是為特定的國家或者特定的目的設(shè)計(jì)的。為每一種類型的軟鍵盤改變解釋字符的方式可能不同缆毁,有兩種改變解釋字符的方式:使用IMC_SETSOFKBDSUBTYPE或者IMC_SETSOFKBDDATA番川。不同類型的軟鍵盤有不同的窗口過程并存在不同的用戶界面給用戶。?
 
七脊框、IME接口?
????在Windows 95中颁督,IME與設(shè)備驅(qū)動(dòng)程序一樣是動(dòng)態(tài)鏈接庫(DLL),輸入法管理器(IMM)應(yīng)該處理所有安裝的IME浇雹。因?yàn)镮ME在運(yùn)行時(shí)是可以改變的沉御,不需要重新啟動(dòng)系統(tǒng),IMM有一個(gè)結(jié)構(gòu)用于維護(hù)每一個(gè)IME的所有入口點(diǎn)昭灵。IME函數(shù)列表是所有遠(yuǎn)東版本W(wǎng)indows 95公共IME功能函數(shù)的描述嚷节,這些函數(shù)不應(yīng)該在應(yīng)用程序中直接調(diào)用。?
 
????UI窗口中的IMM函數(shù)?
????下面是可以在UI窗口中調(diào)用的IMM函數(shù):?
ImmGetCompositionWindow?
ImmSetCompositionWindow?
ImmGetCandidateWindow?
ImmSetCandidateWindow?
ImmGetCompositionString?
ImmSetCompositionString?
ImmGetCompositionFont?
ImmSetCompositionFont?
ImmGetNumCandidateList?
ImmGetCandidateList?
ImmGetGuideLine?
ImmGetConversionStatus?
ImmGetConversionList?
ImmGetOpenStatus?
ImmSetConversionStatus?
ImmSetOpenStatus?
ImmNotifyIME?
ImmCreateSoftKeyboard?
ImmDestroySoftKeyboard?
ImmShowSoftKeyboard

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末虎锚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子衩婚,更是在濱河造成了極大的恐慌窜护,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,324評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件非春,死亡現(xiàn)場離奇詭異柱徙,居然都是意外死亡缓屠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評論 3 392
  • 文/潘曉璐 我一進(jìn)店門护侮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敌完,“玉大人,你說我怎么就攤上這事羊初”醺龋” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評論 0 353
  • 文/不壞的土叔 我叫張陵长赞,是天一觀的道長晦攒。 經(jīng)常有香客問我,道長得哆,這世上最難降的妖魔是什么脯颜? 我笑而不...
    開封第一講書人閱讀 58,147評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮贩据,結(jié)果婚禮上栋操,老公的妹妹穿的比我還像新娘。我一直安慰自己饱亮,他們只是感情好矾芙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著近尚,像睡著了一般蠕啄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上戈锻,一...
    開封第一講書人閱讀 51,115評論 1 296
  • 那天歼跟,我揣著相機(jī)與錄音,去河邊找鬼格遭。 笑死哈街,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拒迅。 我是一名探鬼主播骚秦,決...
    沈念sama閱讀 40,025評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼璧微!你這毒婦竟也來了作箍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,867評論 0 274
  • 序言:老撾萬榮一對情侶失蹤前硫,失蹤者是張志新(化名)和其女友劉穎胞得,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體屹电,經(jīng)...
    沈念sama閱讀 45,307評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡阶剑,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評論 2 332
  • 正文 我和宋清朗相戀三年跃巡,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牧愁。...
    茶點(diǎn)故事閱讀 39,688評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡素邪,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出猪半,到底是詐尸還是另有隱情兔朦,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評論 5 343
  • 正文 年R本政府宣布办龄,位于F島的核電站烘绽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏俐填。R本人自食惡果不足惜安接,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望英融。 院中可真熱鬧盏檐,春花似錦、人聲如沸驶悟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽痕鳍。三九已至硫豆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笼呆,已是汗流浹背熊响。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留诗赌,地道東北人汗茄。 一個(gè)月前我還...
    沈念sama閱讀 47,685評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像铭若,于是被迫代替她去往敵國和親洪碳。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評論 2 353

推薦閱讀更多精彩內(nèi)容