Delphi下編程完成中文輸入法
發(fā)表時間:2024-02-21 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]江 蘇 省 電 信 傳 輸 局 周 曉 ---- Borland Delphi 以 其 強(qiáng) 大 的 功 能 及 和 高 效 的 可 視 化 開 發(fā) 環(huán) 境 為 廣 大 程 序 設(shè) 計(jì) 員 所 青 睞 。 尤 其 是 它 封 裝 了WINDOWS API 函 數(shù), 能 方 便 地 利 用WIND...
江 蘇 省 電 信 傳 輸 局
周 曉
---- Borland Delphi 以 其 強(qiáng) 大 的 功 能 及 和 高 效 的 可 視 化 開 發(fā) 環(huán) 境 為 廣 大 程 序 設(shè) 計(jì) 員 所 青 睞 。 尤 其 是 它 封 裝 了WINDOWS API 函 數(shù), 能 方 便 地 利 用WINDOWS 資 源, 大 大 加 快 了 程 序 開 發(fā) 速 度。
---- 在 平 時 的 計(jì) 算 機(jī) 操 作 中, 中 文 輸 入 是 不 可 避 免 的。 使 用 者 可 能 喜 歡 不 同 的 中 文 輸 入 法(inputmethod editor, 簡 稱IME), 這 就 不 得 不 經(jīng) 常 點(diǎn) 擊 任 務(wù) 欄 中 的 中 文 圖 標(biāo) 或 用CTRL+Space,CTRL+Shift 熱 鍵 切 換, 初 學(xué) 者 用 起 來 很 不 方 便。 針 對 這 一 問 題, 可 以 在 開 發(fā) 軟 件 時, 在 程 序 中 設(shè) 置 用 戶 喜 歡 的 中 文 輸 入 法, 方 便 用 戶 的 使 用。Delphi 中 只 有 少 數(shù) 控 件 如TEdit 支 持IME, 而 且 該 功 能 不 強(qiáng), 不 能 在 運(yùn) 行 時 更 改 輸 入 法。
---- 筆 者 通 過 實(shí) 踐 和 摸 索, 查 找 了 相 關(guān) 的IME 資 料, 利 用 了WINDOWS API 函 數(shù), 實(shí) 現(xiàn) 了IME 的 功 能。
---- 常 用 函 數(shù) 有:
API函數(shù):BOOL ImmSimulateHotKey
(HWND hWnd,DWORD dwHotKeyID);//模擬熱鍵
其中Hwnd為程序窗口的句柄,dwHotHKeyID
為模擬的熱鍵,若成功則返回True
HKL GetKeyboardLayout(DWORD dwLayout);
//獲得當(dāng)前鍵盤狀態(tài)
BOOL ImmIsIME(HKL hKL);
//判斷當(dāng)前是否處于中文輸入狀態(tài),若是則返回True
自定義函數(shù):
打開相應(yīng)輸入法:OpenIme(imename:string),
例OpenIme('全拼輸入法');
關(guān)閉中文輸入法:CloseIme;
以下是一個簡單的例子,僅起參考作用。
使用時uses中加上imm
具體的實(shí)現(xiàn)方法及源代碼如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,
Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons,imm;
type
TForm1 = class(TForm)
ComboBox1: TComboBox;
BitBtn1: TBitBtn;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
procedure FormShow(Sender: TObject);
procedure OpenIme(imename:string);
procedure closeIme;
procedure ComboBox1Change(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormShow(Sender: TObject);
var
j:integer;
begin
for j:=0 to screen.imes.count-1 do
begin
ComBoBox1.Items.Add(screen.Imes.strings[j]);
//獲取系統(tǒng)中已安裝的中文輸入法
end;
end;
procedure Tform1.OpenIme(imename:string);
var
I:integer;
myhkl:hkl;
begin
if ImeName<>'' then
begin
if Screen.Imes.Count<>0 then
begin
I:=screen.Imes.indexof(imename);
if I>=0 then
myhkl:=hkl(screen.Imes.objects[i]);
activatekeyboardlayout(myhkl,
KLF_ACTIVATE);//設(shè)置相應(yīng)的輸入法
end;
end;
end;
procedure TForm1.closeime;
var
myhkl:hkl;
begin
myhkl:=GetKeyBoardLayOut(0);
if ImmIsIME(myhkl) then
//判斷是否在中文狀態(tài),若是則關(guān)閉它
immsimulateHotkey(handle,
IME_CHotKey_IME_NonIME_Toggle);
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);
//切換中文標(biāo)點(diǎn)模式和英文標(biāo)點(diǎn)模式
end;
procedure TForm1.BitBtn3Click(Sender: TObject);
begin
closeime;
end;
end.
---- 本 程 序 在Delphi 3.0/4.0 下 通 過。