首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

Windows 95 輸入法編輯器 (IME) 程式設計完整指南

     編輯:VC 教學

前言

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)取得組合字串、結果字串、讀音等

六、訊息流向與處理

  1. 使用者按鍵 → 系統訊息佇列
  2. TranslateMessage 產生 WM_IME_* 訊息
  3. 無支援視窗:DefWindowProc 轉送至預設 IME 視窗
  4. 部分支援視窗:自行處理或轉送至應用程式 IME 視窗
  5. 完全支援視窗:自行處理所有 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 架構對維護舊系統、開發自訂輸入法、處理相容性問題仍具高度參考價值。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved