Delphi 下 编 程 实 现 中 文 输 入 法
江 苏 省 电 信 传 输 局
周 晓
---- Borland Delphi 以 其 强 大 的 功 能 及 和 高 效 的 可 视 化 开 发 环 境 为 广 大 程 序 设 计 员 所 青 睐 。 尤 其 是 它 封 装 了WINDOWS API 函 数, 能 方 便 地 利 用WINDOWS 资 源, 大 大 加 快 了 程 序 开 发 速 度。 ---- 在 平 时 的 计 算 机 操 作 中, 中 文 输 入 是 不 可 避 免 的。 使 用 者 可 能 喜 欢 不 同 的 中 文 输 入 法(inputmethod editor, 简 称IME), 这 就 不 得 不 经 常 点 击 任 务 栏 中 的 中 文 图 标 或 用CTRL+Space,CTRL+Shift 热 键 切 换, 初 学 者 用 起 来 很 不 方 便。 针 对 这 一 问 题, 可 以 在 开 发 软 件 时, 在 程 序 中 设 置 用 户 喜 欢 的 中 文 输 入 法, 方 便 用 户 的 使 用。Delphi 中 只 有 少 数 控 件 如TEdit 支 持IME, 而 且 该 功 能 不 强, 不 能 在 运 行 时 更 改 输 入 法。 ---- 笔 者 通 过 实 践 和 摸 索, 查 找 了 相 关 的IME 资 料, 利 用 了WINDOWS API 函 数, 实 现 了IME 的 功 能。 ---- 常 用 函 数 有: API函数:BOOL ImmSimulateHotKey
(HWND hWnd,DWORD dwHotKeyID);//模拟热键
其中Hwnd为程序窗口的句柄,dwHotHKeyID
为模拟的热键,若成功则返回True
HKL GetKeyboardLayout(DWORD dwLayout);
//获得当前键盘状态
BOOL ImmIsIME(HKL hKL);
//判断当前是否处于中文输入状态,若是则返回True
自定义函数:
打开相应输入法:OpenIme(imename:string),
例OpenIme('全拼输入法');
关闭中文输入法:CloseIme;
以下是一个简单的例子,仅起参考作用。使用时uses中加上imm 具体的实现方法及源代码如下:
unit Unit1;interfaceuses
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]);
//获取系统中已安装的中文输入法
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);//设置相应的输入法
end;
end;
end;procedure TForm1.closeime;
var
myhkl:hkl;
begin
myhkl:=GetKeyBoardLayOut(0);
if ImmIsIME(myhkl) then
//判断是否在中文状态,若是则关闭它
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);
//切换中文标点模式和英文标点模式
end;procedure TForm1.BitBtn3Click(Sender: TObject);
begin
closeime;
end;end.---- 本 程 序 在Delphi 3.0/4.0 下 通 过。
江 苏 省 电 信 传 输 局
周 晓
---- Borland Delphi 以 其 强 大 的 功 能 及 和 高 效 的 可 视 化 开 发 环 境 为 广 大 程 序 设 计 员 所 青 睐 。 尤 其 是 它 封 装 了WINDOWS API 函 数, 能 方 便 地 利 用WINDOWS 资 源, 大 大 加 快 了 程 序 开 发 速 度。 ---- 在 平 时 的 计 算 机 操 作 中, 中 文 输 入 是 不 可 避 免 的。 使 用 者 可 能 喜 欢 不 同 的 中 文 输 入 法(inputmethod editor, 简 称IME), 这 就 不 得 不 经 常 点 击 任 务 栏 中 的 中 文 图 标 或 用CTRL+Space,CTRL+Shift 热 键 切 换, 初 学 者 用 起 来 很 不 方 便。 针 对 这 一 问 题, 可 以 在 开 发 软 件 时, 在 程 序 中 设 置 用 户 喜 欢 的 中 文 输 入 法, 方 便 用 户 的 使 用。Delphi 中 只 有 少 数 控 件 如TEdit 支 持IME, 而 且 该 功 能 不 强, 不 能 在 运 行 时 更 改 输 入 法。 ---- 笔 者 通 过 实 践 和 摸 索, 查 找 了 相 关 的IME 资 料, 利 用 了WINDOWS API 函 数, 实 现 了IME 的 功 能。 ---- 常 用 函 数 有: API函数:BOOL ImmSimulateHotKey
(HWND hWnd,DWORD dwHotKeyID);//模拟热键
其中Hwnd为程序窗口的句柄,dwHotHKeyID
为模拟的热键,若成功则返回True
HKL GetKeyboardLayout(DWORD dwLayout);
//获得当前键盘状态
BOOL ImmIsIME(HKL hKL);
//判断当前是否处于中文输入状态,若是则返回True
自定义函数:
打开相应输入法:OpenIme(imename:string),
例OpenIme('全拼输入法');
关闭中文输入法:CloseIme;
以下是一个简单的例子,仅起参考作用。使用时uses中加上imm 具体的实现方法及源代码如下:
unit Unit1;interfaceuses
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]);
//获取系统中已安装的中文输入法
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);//设置相应的输入法
end;
end;
end;procedure TForm1.closeime;
var
myhkl:hkl;
begin
myhkl:=GetKeyBoardLayOut(0);
if ImmIsIME(myhkl) then
//判断是否在中文状态,若是则关闭它
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);
//切换中文标点模式和英文标点模式
end;procedure TForm1.BitBtn3Click(Sender: TObject);
begin
closeime;
end;end.---- 本 程 序 在Delphi 3.0/4.0 下 通 过。
解决方案 »
- 求个说明书
- 关于文件关联的问题
- 急:怎樣對Dbgrid中數據實現橫向及纵向求和?
- 怎样用DBGrid显示TStringList的内容?
- 紧急求救!!!添加memo字段的SQL怎么写????救命啊.
- 一个画图问题,请大家帮忙
- 高手过来看看,我在Web ServerApplication中的ISAPO/NSAPI建立 在虚拟目录下就是出现不了
- 对《分析DFM文件生成程序界面》提出的问题
- 一个简单的EDIT问题
- Delphi中的ScrollBar是怎么回事?
- 求控件:TBitBtn、TSpeedButton的图像能放在dll里面
- 一个初学者的问题,关于组件ListBox1及DBComboBox1中被选中的项目使用什么参数呢?
不过,您能留下您的QQ或Emai吗?这样我有什么问题可以直接请教您了!