使用者常需在多種中文輸入法(全拼、倉頡、注音等)間切換,預設熱鍵 (Ctrl+Space, Ctrl+Shift) 易忘且不直覺。VCL 僅 TEdit 等少數控件支援 IME,且無法在執行期動態切換。本文示範如何透過 Imm32 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。