前言
Windows 95 引入全新的 IME 架構:每個 IME 為一個 DLL,整合於多語言鍵盤配置系統,提供每執行緒獨立輸入內容、訊息循環傳遞、對無 IME 感知應用程式的相容支援。本文詳述 IME 架構、應用程式支援層級、使用者介面窗口類別與程式設計介面。
一、Windows 95 IME 架構特色
- IME 為 DLL,對應一種鍵盤配置
- 每個應用程式任務擁有多重輸入內容
- 每個執行緒擁有一個作用中 IME
- 透過應用程式訊息循環傳遞通知(順序不可變)
- 強化對無 IME 支援與部分支援應用程式的相容性
二、IME 兩大核心元件
| 元件 | 實作方式 | 說明 |
| IME 轉換介面 | 匯出函數集 | 由 IMM (Input Method Manager) 呼叫,處理字碼轉換、候選字管理 |
| IME 使用者介面 | 視窗類別集 | 接收訊息、繪製候選視窗、組合字串、工具列等 UI |
三、應用程式 IME 支援層級
| 層級 | 特徵 | IME 視窗 | 輸入內容管理 |
| 無支援 | 不控制 IME,僅接收 DBCS 字元 | 系統預設 IME 視窗 | 系統預設內容 |
| 部分支援 | 控制開關、組合視窗位置,不繪製 UI | 自建「IME」類別視窗 | 可自管或用預設 |
| 完全支援 | 全權管理 IME 顯示資訊 | 不使用 IME 視窗 | 自行管理所有內容 |
四、IME 使用者介面架構
1. 「IME」全域視窗類別
- 預先註冊的全域類別,類似
EDIT、BUTTON
- 透過
CreateWindowEx 建立實例
- 本身不回應使用者輸入,改處理控制訊息實作完整 UI
- 不可被個別 IME 取代
2. 兩類 IME 視窗
| 類型 | 建立者 | 訊息處理 | 共享範圍 |
| 預設 IME 視窗 | 系統(執行緒初始化時) | DefWindowProc | 該執行緒所有無支援視窗共享 |
| 應用程式 IME 視窗 | 部分/完全支援應用程式 | 應用程式視窗程序 | 專屬於建立者 |
3. 視窗程序與 IME 類別互動
- 透過
WM_IME_SELECT 通知新選中 IME 的鍵盤配置
- IME 類別依配置查找 IME 定義的 UI 視窗類別名稱
- 建立對應的 UI 視窗(候選視窗、組合視窗、工具列等)
五、關鍵 API 函數
| 函數 | 用途 |
| ImmGetDefaultIMEWnd(hwnd) | 取得視窗關聯的預設 IME 視窗控制代碼 |
| ImmGetContext(hwnd) | 取得輸入內容 (HIMC) |
| ImmSetCompositionWindow(himc, lpCompForm) | 設定組合視窗位置/風格 |
| ImmSetCandidateWindow(himc, lpCandidateForm) | 設定候選視窗位置/風格 |
| ImmNotifyIME(himc, action, index, value) | 通知 IME 狀態變更(開關、轉換等) |
| ImmGetCompositionString(himc, dwIndex, lpBuf, dwBufLen) | 取得組合字串、結果字串、讀音等 |
六、訊息流向與處理
- 使用者按鍵 → 系統訊息佇列
TranslateMessage 產生 WM_IME_* 訊息
- 無支援視窗:
DefWindowProc 轉送至預設 IME 視窗
- 部分支援視窗:自行處理或轉送至應用程式 IME 視窗
- 完全支援視窗:自行處理所有 IME 訊息,繪製 UI
七、開發建議
- 現代應用建議實作完全支援,掌控完整輸入體驗
- 使用
ImmGetContext 取得 HIMC,搭配 ImmSetCompositionWindow 讓組合視窗跟隨游標
- 處理
WM_IME_COMPOSITION 取得結果字串(GCS_RESULTSTR)
- 支援 Unicode(
WM_IME_CHAR、ImmGetCompositionStringW)
- 測試多語言環境:中文(新注音/微軟拼音)、日文(MS-IME)、韓文等
結語
Windows 95 IME 架構奠定了後續版本(98/NT/2000/XP/Vista/7/10/11)輸入法系統的基礎。雖然現代應用多採用 TSF (Text Services Framework),但理解 IME 架構對維護舊系統、開發自訂輸入法、處理相容性問題仍具高度參考價值。