精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Delphi>>中文相关>>Delphi下编程实现中文输入法

主题:Delphi下编程实现中文输入法
发信人: teleme(PassWord)
整理人: teleme(2001-02-11 10:48:29), 站内信件

江 苏 省 电 信 传 输 局 周 晓  
---- Borland Delphi 以 其 强 大 的 功 能 及 和 高 效 的 可 视 化 开 发
 环 境 为 广 大 程 序 设 计 员 所 青 睐 。 尤 其 是 它 封 装 了WINDOWS
 API 函 数, 能 方 便 地 利 用WINDOWS 资 源, 大 大 加 快 了 程 序 开 发
 速 度。  
---- 在 平 时 的 计 算 机 操 作 中, 中 文 输 入 是 不 可 避 免 的。 使
 用 者 可 能 喜 欢 不 同 的 中 文 输 入 法(inputmethod editor, 简 称IM
E), 这 就 不 得 不 经 常 点 击 任 务 栏 中 的 中 文 图 标 或 用CTRL+Sp
ace,CTRL+Shift 热 键 切 换, 初 学 者 用 起 来 很 不 方 便。 针 对 这 一
 问 题, 可 以 在 开 发 软 件 时, 在 程 序 中 设 置 用 户 喜 欢 的 中 
文 输 入 法, 方 便 用 户 的 使 用。Delphi 中 只 有 少 数 控 件 如TEdit
 支 持IME, 而 且 该 功 能 不 强, 不 能 在 运 行 时 更 改 输 入 法。  
---- 笔 者 通 过 实 践 和 摸 索, 查 找 了 相 关 的IME 资 料, 利 用 了W
INDOWS API 函 数, 实 现 了IME 的 功 能。 ---- 常 用 函 数 有: API函数
:BOOL ImmSimulateHotKey 
     (HWND hWnd,DWORD dwHotKeyID);//模拟热键     其中Hwnd为程序窗口的句
柄,dwHotHKeyID 
      为模拟的热键,若成功则返回True            HKL GetKeyboardLayout(D
WORD dwLayout); 
        //获得当前键盘状态           BOOL ImmIsIME(HKL hKL); 
     //判断当前是否处于中文输入状态,若是则返回True 自定义函数: 打开相
应输入法:OpenIme(imename:string), 
                 例OpenIme('全拼输入法'); 关闭中文输入法:CloseIme;   
以下是一个简单的例子,仅起参考作用。 
使用时uses中加上imm 具体的实现方法及源代码如下: unit Unit1;interfaceu
ses 
 Windows, Messages, SysUtils, Classes,  Graphics, Controls, Forms, Di
alogs, 
 StdCtrls, Buttons,imm;type TForm1 = class(TForm)  ComboBox1: TComboBo
x; 
  BitBtn1: TBitBtn;  BitBtn2: TBitBtn;  BitBtn3: TBitBtn; 
  procedure FormShow(Sender: TObject);  procedure OpenIme(imename:stri
ng); 
  procedure closeIme;  procedure ComboBox1Change(Sender: TObject); 
  procedure BitBtn1Click(Sender: TObject); 
  procedure BitBtn2Click(Sender: TObject); 
  procedure BitBtn3Click(Sender: TObject);   private  { Private declar
ations } 
 public  { Public declarations } end;var Form1: TForm1;implementation{
$R *.DFM} 
procedure TForm1.FormShow(Sender: TObject);varj:integer;begin 
  for j:=0 to screen.imes.count-1 do  begin 
  ComBoBox1.Items.Add(screen.Imes.strings[j]); //获取系统中已安装的中
文输入法  end;end; 
procedure Tform1.OpenIme(imename:string);varI: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);//设置相应的输入法    end;  end;              end; 
procedure TForm1.closeime;varmyhkl:hkl;beginmyhkl:=GetKeyBoardLayOut(0
); 
if ImmIsIME(myhkl) then   //判断是否在中文状态,若是则关闭它  immsimula
teHotkey(handle, 
  IME_CHotKey_IME_NonIME_Toggle);end; 
procedure TForm1.ComboBox1Change(Sender: TObject);beginOpenIme(ComboBo
x1.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);begincloseime;end;end. 

---- 本 程 序 在Delphi 3.0/4.0 下 通 过。 

 
 

[关闭][返回]