當前位置:縱橫輸入法首頁>>教學經驗交流>>第二屆縱橫碼教學經驗交流會論文集

基於中文Windows平台的縱橫碼輸入系統的實現技術
蘇州大學縱橫漢字信息技術研究所 呂強 王紅玲 張玉華

一、引言

  基於Windows平台的縱橫碼輸入系統,是一個專為Windows中文環境提供縱橫碼漢字輸入的系統。該系統全部使用Windows提供的標準API調用,在應用程序這一層次上實現了輸入功能,因此其代碼無須任何修改便可以運行於所有的Windows中文平台(包括中文Windows 3.1,中文Windows 3.2,中文Windows 95,中西方Windows與Cstar或RichWin等的組合)。系統提供了單字、詞組聯想和自定義輸入功能;同時,系統還提供了一些配套程序,用於維護自定義碼表等。系統具有安裝簡單、操作方便、靈活等特點,與通過使用Windows提供的輸入法生成器生成的輸入法相比較,具有碼表結構更靈活,詞條數目更大,系統功能更全面等優點。

二、系統結構

  ZH1、ZH2、ZH3、ZH4、ZH5、LX2、LX3、LX4、LX5是縱橫碼輸入系統所用的碼表,其中ZH1~ZH5分別表示單字,二字詞,三字詞,四字詞及多字詞碼表,它們的結構如下:碼表以項為單位,一項表示縱橫碼和它對應的字或詞條。每一項中縱橫碼佔3個字節,不足3位以0xFF補足。縱橫碼以BCD碼形式存放,接著存放漢字內碼。對於ZH1~ZH4,漢字存放沒有結束符,而ZH5即多字詞碼表(五字詞以上)由於不能確定詞組的長度,因此表項為不等長,每一項以「0xFF」為結束符。LX2、LX3、LX4、LX5是系統聯想碼表,其數據結構如圖1所示。(圖2所示為ZH5結構)

圖1,2

  另外,系統中還使用了兩個碼表:zdyz和zdyc。這兩個文件是由系統生成,由用戶添加內容,是專用於存放自定義字詞的文件。「zdyz」存放字,結構與「zh1」相同;「zdyc」存放詞組,結構同「zh5」相同,每項以「0xFF」結束。

三、查表算法

  系統收到輸入碼結束後,即開始查表。如果結束鍵是「/」或空格,對「zdyz」和「zh1」 進行操作;如果結束是「*」鍵,則對「zhyc」、「zh2」、「zh3」、「zh4 」、「zh5」進行操作。算法如下:首先將輸入碼緩衝區(InputCodeBuf)中的縱橫輸入碼由ASCII碼轉化成壓縮的BCD碼,放入code數據組中。順序打開文件,將文件指針IpbMb〔i〕指向文件頭,指針所指的連續的三個字節送入code1數組中,將code與code1的內容作比較。如果相同,將文件對應的那一項漢字內碼送入輸出緩衝區(OutputBuf)中。如為漢字,則三個字節的縱橫碼接下的二個字節既為所需漢字;如為詞組,又分為兩種情況:五字詞以下,則按一個漢字佔兩個字節來看,有幾個漢字就是它的兩倍字節,項與項中間沒有分隔符;五字詞及五字詞以上,項與項之間用0xFF分隔。不管兩個數組中的內容是否匹配,文件指針都必須向後移過一項。查找匹配過程一直進行到所有文件都查找完畢。最後,所有與輸入碼相符的漢字或詞組均放在OutputBuf中,由顯示輸出模塊顯示。

四、鍵盤截取

  1. Windows消息機制

  Windows通過發送消息與程序通信。所有的Windows程序都在WinMain ( )函數中建立消息循環。該循環從應用程序的消息隊列中讀取尚未處理的消息,並再將該消息分配回Windows,由Windows以該消息作為參數調用應用程序的窗口函數。可通過調用函數GetMessage ( )讀取消息。在消息循環內,共調用了2個函數。第一個是API函數TranslateMessage ( )。該函數負責將Windows生成的虛鍵盤代碼轉換成字符消息。讀取和翻譯完消息後,還應將其送至Windows,具體可通過API函數DispathchMessage實現。Windows會一直保存該消息,直到它被傳遞給應用程序的窗口函數。消息循環一旦中止,Windows ( )函數也隨這結束,將程序中止時所產生的返回碼返回給Windows。

  該系統Windows消息循環主要處理了WM_CHAR,WM_LX,WM_SEPERATOR,WM_DINGYI等消息,其中WM_LX,WM_SEPERATOR,WM_DINGYI消息是本系統自定義的消息。

  2. 控鍵轉義實現

  該系統設置了一些快捷鍵來實現某種功能,如聯想功能,標點功能,自定義功能等。系統使用的動態鏈接庫為「hook.dll」。這一模塊的功能是截取鍵盤上的輸入鍵,將輸入鍵進行過濾,濾掉系統不使用的鍵,保留系統所用鍵。再對特殊鍵進行特殊操作,如Ctrl+1(小鍵盤)作為聯想功能的快捷鍵,它所發的按鍵消息為自定義的「WM_LX」消息;Ctrl+2(小鍵盤)為自定義單字、詞組的快捷鍵,發送「WM_DINGYI」消息;Ctrl+3(小鍵盤)為標點輸入的快捷鍵,發送「WM_SEPERATOR」消息。對於非特殊按鍵,則一律將之轉換成對應的字符,向主程序發出「WM_CHAR」消息。由主程序對各類消息進行處理。對於其他按鍵,由操作系統按原按鍵消息進行處理。

  該系統另一特點是,完全使用小鍵盤進行輸入。 由於在Windows中對按鍵以虛鍵碼來處理。對於小鍵盤上的鍵,當NumLock鍵打開時的虛鍵碼同關閉時的虛鍵碼是不同的。要在忽略NumLock鍵的情況下唯一確定小鍵盤上的鍵,只能使用這些鍵的掃瞄碼,因此在動態鏈接庫中,對小鍵盤上的鍵做了特殊處理,取得鍵的掃瞄碼將之轉化為對應的ASCII碼,並向應用程度窗口發送WM_CHAR消息,由主程序處理。

五、結束語

  該輸入系統的框架結構、功能已基本完成,但在界面設置方面有待完善。限於編程語言的限制,以後的發展趨勢應是現可視化、圖形化方向發展, 應從16位編程向32位編程發展。