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

在 Delphi 中程式化控制中文輸入法 (IME)

     編輯:Delphi

痛點與目標

使用者常需在多種中文輸入法(全拼、倉頡、注音等)間切換,預設熱鍵 (Ctrl+Space, Ctrl+Shift) 易忘且不直覺。VCL 僅 TEdit 等少數控件支援 IME,且無法在執行期動態切換。本文示範如何透過 Imm32 API,打造可程式化開啟/關閉/切換輸入法的功能,提升使用者體驗。

核心 API 函數

函數用途
ImmSimulateHotKey(hWnd, dwHotKeyID)模擬輸入法熱鍵(如開關中英、全半形、標點切換)
GetKeyboardLayout(dwLayout)取得目前鍵盤配置代碼 (HKL)
ImmIsIME(hKL)判斷目前是否處於中文輸入狀態
ActivateKeyboardLayout(hKL, KLF_ACTIVATE)啟動指定鍵盤配置(即切換輸入法)

需在 uses 子句加入 Imm 單元。

自訂輔助函數

// 開啟指定名稱的輸入法
procedure OpenIme(const ImeName: string);
var
  I: Integer;
  TargetHKL: HKL;
begin
  if (ImeName = '') or (Screen.Imes.Count = 0) then Exit;
  I := Screen.Imes.IndexOf(ImeName);
  if I >= 0 then
  begin
    TargetHKL := HKL(Screen.Imes.Objects[I]);
    ActivateKeyboardLayout(TargetHKL, KLF_ACTIVATE);
  end;
end;

// 關閉中文輸入法(切回英數)
procedure CloseIme;
var
  CurHKL: HKL;
begin
  CurHKL := GetKeyboardLayout(0);
  if ImmIsIME(CurHKL) then
    ImmSimulateHotKey(Application.Handle, IME_CHOTKEY_IME_NONIME_TOGGLE);
end;

完整表單範例

介面包含:TComboBox 列出系統安裝的輸入法、三個按鈕分別對應「全半形切換」、「中英標點切換」、「關閉中文輸入法」。

procedure TForm1.FormShow(Sender: TObject);
var
  J: Integer;
begin
  for J := 0 to Screen.Imes.Count - 1 do
    ComboBox1.Items.Add(Screen.Imes.Strings[J]); // 列舉已安裝輸入法
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  OpenIme(ComboBox1.Text); // 使用者選擇即切換
end;

procedure TForm1.BitBtn1Click(Sender: TObject); // 全半形
begin
  ImmSimulateHotKey(Handle, IME_CHOTKEY_SHAPE_TOGGLE);
end;

procedure TForm1.BitBtn2Click(Sender: TObject); // 標點切換
begin
  ImmSimulateHotKey(Handle, IME_CHOTKEY_SYMBOL_TOGGLE);
end;

procedure TForm1.BitBtn3Click(Sender: TObject); // 關閉 IME
begin
  CloseIme;
end;

實作提醒

  • Screen.Imes 僅列舉系統已安裝的輸入法,若使用者未安裝目標 IME,IndexOf 會傳回 -1。
  • 熱鍵常數 (IME_CHOTKEY_*) 定義於 Imm.pas,涵蓋開關中英、全半形、標點、候選窗等常見操作。
  • 若需在特定控件取得焦點時自動切換輸入法,可在控件的 OnEnter 事件呼叫 OpenIme。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved