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)跟隨窗口中的插入符號位置,為每一個(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窗口會等待處理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存儲消息到lpdwTransKey緩沖區(qū)中,不過即使ImeToAsciiEx函數(shù)沒有?
被調(diào)用,IME也可以生成消息給使用輸入上下文的消息緩沖區(qū)與輸入上下文交互的窗口。輸入上下文有一個(gè)內(nèi)存塊的句柄作為消息緩沖區(qū),IME存儲消息到被消息緩沖區(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ù)可以一次存儲所有的消息到該緩沖區(qū)中,緩沖區(qū)的第一個(gè)雙字給出存儲在緩沖區(qū)中的消息個(gè)數(shù)。如果ImeToAsciiEx函數(shù)需要生成比這個(gè)給定的個(gè)數(shù)更多的消息,函數(shù)可以存儲所有的消息到輸入上下文的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也會設(shè)置GCS位。?
????為IME定義服務(wù)?
????當(dāng)IME生成WM_IME_COMPOSITION消息時(shí),IME可能會立刻改變字符串、屬性以及子句信息。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可能使用注音符號作為解釋字符(這里指臺灣中文版Windows 95,即CWin95中的注音符號,PWin95中可能指漢語拼音字母或者音調(diào)符號――譯者注),另一個(gè)IME使用了一些字根符號(原文單詞是“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