怎么知道用户是否调用输入法,切换输入法 你不妨用Winsight32跟踪一下,看看切换输入法会触发哪些消息。应该是WM_IME_*的某个消息。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 ImmGetConversionStatus(ImmGetContext(GetForegroundWindow),a,b)或 TID := GetWindowThreadProcessID(GetForegroundWindow,@PID);MyHkl := GetKeyBoardLayout(TID); 转载Delphi实现自动切换输入法我们在使用 Windows 平台(以下指中文版Windows)的软件时,常常需要输入一些有关信息,有时在一个编辑框内输入中文,而另一个编辑框却要求输入英文,这时我们不得不切换输入法。当我们在录入大量上述条件的数据至数据库时,频繁的切换无疑对速度影响很大,那么能不能在光标落入编辑框内时,就自动切换为所需的输入法呢?答案是肯定的,Delphi中就可以实现。在delphi中,可直接键入内容的元件都具有ImeMode、ImeName属性,IME为(Input Method Editor)的缩写。其中ImeMode 为枚举型变量,取值为(imDisableimClose,imOpen,imDontCare,imSAlpha,imAlpha,imHira,imSKataimKata,imChinese,imSHanguel,imHanguel)默认为imDontCare其他几种属性值与本文没有很大关系,内容又多,因此略过。ImeName也是枚举型变量,默认为空,具体取值范围与系统中所装输入法有关,在Delphi启动时,自动检测得变量取值范围,对于中文版Windows而言,智能ABC输入法、全拼输入法都是缺省安装的。例如:一个用户登录窗口要求输入用户名(中文),口令(英文字母与数字的组合)。假设用户名为“陈理辉”,口令为“student”。设计步骤如下:新建一窗体,设置其属性为Caption: 登录窗口Name LoginFormBborderStyle bsDialog;FormStyle: fsStayonTopPosition poScreenCenter在窗体中放入两个TLabel构件,分别设置为Caption 请输入用户名:Caption 密码:在窗体中放入一个TEdit构件,设置为Name UserNameEdtTextImeName 智能ABC输入法在窗体中放入一个TEdit构件,设置为Name PassWordEdt;TextPasswordChar ′*′放入一个TButton构件,设置为Caption 确认(&O)Name OkBtn双击该构件加入如下代码:procedure TLoginForm.OkBtnClick(Sender:TObject);beginif (UserNameEdt.text=′陈理辉′) and (PasswordEdt.TExt=′student′) thenbeginShowMessage(′密码正确,登录成功!′);Application.Terminate;EndElseShowMessage(′密码错误,请再试。′);end;放入一个 TButton 构件,设置为Caption 取消(&C)Name CancelBtn双击该构件加入如下代码:procedure TLoginForm.CancelBtnClick(Sender:TObject);beginApplication.Terminate;end;7.将Project存为Login.dpr将LoginForm设为主窗口(点Project|Options选Forms标签页点Main Form下拉框,选LoginForm按Ok),按F9运行。不用手工切换输入法是不是很方便?以上在Delphi 2.0 ,3.0 上通过。 又要谢谢chechy了Winsight32我已经用过了,它的消息太多了,看不过来@_@我在msdn里也查过,也没查到,还请chechy等大虾指点一二 转载Delphi下编程实现中文输入法---- Borland Delphi 以 其 强 大 的 功 能 及 和 高 效 的 可 视 化 开 发 环 境 为 广 大 程 序 设 计 员 所 青 睐 。 尤 其 是 它 封 装 了WINDOWS API 函 数, 能 方 便 地 利 用WINDOWS 资 源大 大 加 快 了 程 序 开 发 速 度。---- 在 平 时 的 计 算 机 操 作 中中 文 输 入 是 不 可 避 免 的。 使 用 者 可 能 喜 欢 不 同 的 中 文 输 入 法(inputmethod editor简 称IME)这 就 不 得 不 经 常 点 击 任 务 栏 中 的 中 文 图 标 或 用CTRL+SpaceCTRL+Shift 热 键 切 换初 学 者 用 起 来 很 不 方 便。 针 对 这 一 问 题, 可 以 在 开 发 软 件 时在 程 序 中 设 置 用 户 喜 欢 的 中 文 输 入 法方 便 用 户 的 使 用。Delphi 中 只 有 少 数 控 件 如TEdit 支 持IME而 且 该 功 能 不 强不 能 在 运 行 时 更 改 输 入 法。---- 笔 者 通 过 实 践 和 摸 索查 找 了 相 关 的IME 资 料利 用 了WINDOWS API 函 数实 现 了IME 的 功 能。---- 常 用 函 数 有:API函数:BOOL ImmSimulateHotKey(HWND hWndDWORD dwHotKeyID);//模拟热键其中Hwnd为程序窗口的句柄dwHotHKeyID为模拟的热键若成功则返回TrueHKL GetKeyboardLayout(DWORD dwLayout);//获得当前键盘状态BOOL ImmIsIME(HKL hKL);//判断当前是否处于中文输入状态若是则返回True自定义函数:打开相应输入法:OpenIme(imename:string)例OpenIme('全拼输入法');关闭中文输入法:CloseIme;以下是一个简单的例子,仅起参考作用。使用时uses中加上imm具体的实现方法及源代码如下:unit Unit1;interfaceusesWindowsMessagesSysUtilsClassesGraphicsControlsFormsDialogsStdCtrlsButtonsimm;typeTForm1 = 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;varForm1: TForm1;implementation{$R *.DFM}procedure TForm1.FormShow(Sender: TObject);varj:integer;beginfor j:=0 to screen.imes.count-1 dobeginComBoBox1.Items.Add(screen.Imes.strings[j]);//获取系统中已安装的中文输入法end;end;procedure Tform1.OpenIme(imename:string);varI:integer;myhkl:hkl;beginif ImeName<>'' thenbeginif Screen.Imes.Count<>0 thenbeginI:=screen.Imes.indexof(imename);if I>=0 thenmyhkl:=hkl(screen.Imes.objects[i]);activatekeyboardlayout(myhklKLF_ACTIVATE);//设置相应的输入法end;end;end;procedure TForm1.closeime;varmyhkl:hkl;beginmyhkl:=GetKeyBoardLayOut(0);if ImmIsIME(myhkl) then//判断是否在中文状态若是则关闭它immsimulateHotkey(handleIME_CHotKey_IME_NonIME_Toggle);end;procedure TForm1.ComboBox1Change(Sender: TObject);beginOpenIme(ComboBox1.Text);end;procedure TForm1.BitBtn1Click(Sender: TObject);beginimmsimulateHotkey(handleIME_CHotKey_shape_Toggle);//切换半角和全角模式end;procedure TForm1.BitBtn2Click(Sender: TObject);beginimmsimulateHotkey(handleIME_CHotKey_symbol_Toggle);//切换中文标点模式和英文标点模式end;procedure TForm1.BitBtn3Click(Sender: TObject);begincloseime;end;end.---- 本 程 序 在Delphi 3.0/4.0 下 通 过 消息确实很多,所以,我一般都是采用消息过滤的,只跟踪部分消息。这里,需要关注WM_IME_*的消息,所以就跟踪这一部分。 是否调用输入法:你不停去用FINDWINDOW()找输入法的窗口啊切换输入法:关注 谢谢zfmich(),这篇文章我看过了,但它是指用api来达到改变输入法的,不符合我的要求,lxl(蚊蚊)这种办法我是绝不会用的,太耗资源了,to all 我用Winsight32好象已经找到了那两个消息了,WM_IME_SETCONTEXT,WM_IME_NOTIFY,还在研究中,有结果一定告诉大家 打开.dpr提示错误,菜鸟求高手解决。 请教:允许程序只运行一个实例,内容如下 关于shockwaveflash控件的简单问题 无法装载midas.dll,急,急!! Sendmessage消息丢失????????????????? 有没有执行SQL脚本的控件啊?〔ADO方式〕 如何知道DBGrid的记录是否有更改过? 十万火急求教以下问题,谢谢!! 怎么样把access97转换成SQL SERVER oracle 存储过程返回游标调用 FOMULA ONE 如何合并,拆分单元格?(特急) 帮帮忙吧,一个广播的简单问题
或
TID := GetWindowThreadProcessID(GetForegroundWindow,@PID);
MyHkl := GetKeyBoardLayout(TID);
我们在使用 Windows 平台(以下指中文版Windows)的软件时,常常需要输入一些有关信息,有时在一个编辑框内输入中文,而另一个编辑框却要求输入英文,这时我们不得不切换输入法。当我们在录入大量上述条件的数据至数据库时,频繁的切换无疑对速度影响很大,那么能不能在光标落入编辑框内时,就自动切换为所需的输入法呢?答案是肯定的,Delphi中就可以实现。
在delphi中,可直接键入内容的元件都具有ImeMode、ImeName属性,IME为(Input Method Editor)的缩写。其中ImeMode 为枚举型变量,取值为(imDisableimClose,imOpen,imDontCare,imSAlpha,imAlpha,imHira,imSKataimKata,imChinese,imSHanguel,imHanguel)默认为imDontCare其他几种属性值与本文没有很大关系,内容又多,因此略过。ImeName也是枚举型变量,默认为空,具体取值范围与系统中所装输入法有关,在Delphi启动时,自动检测得变量取值范围,对于中文版Windows而言,智能ABC输入法、全拼输入法都是缺省安装的。
例如:一个用户登录窗口要求输入用户名(中文),口令(英文字母与数字的组合)。假设用户名为“陈理辉”,口令为“student”。设计步骤如下:
新建一窗体,设置其属性为Caption: 登录窗口Name LoginFormBborderStyle bsDialog;FormStyle: fsStayonTopPosition poScreenCenter
在窗体中放入两个TLabel构件,分别设置为Caption 请输入用户名:Caption 密码:
在窗体中放入一个TEdit构件,设置为Name UserNameEdtTextImeName 智能ABC输入法
在窗体中放入一个TEdit构件,设置为Name PassWordEdt;TextPasswordChar ′*′
放入一个TButton构件,设置为Caption 确认(&O)Name OkBtn
双击该构件加入如下代码:procedure TLoginForm.OkBtnClick(Sender:TObject);beginif (UserNameEdt.text=′陈理辉′) and (PasswordEdt.TExt=′student′) thenbeginShowMessage(′密码正确,登录成功!′);Application.Terminate;EndElseShowMessage(′密码错误,请再试。′);end;
放入一个 TButton 构件,设置为Caption 取消(&C)Name CancelBtn
双击该构件加入如下代码:procedure TLoginForm.CancelBtnClick(Sender:TObject);beginApplication.Terminate;end;
7.将Project存为Login.dpr将LoginForm设为主窗口(点Project|Options选Forms标签页点Main Form下拉框,选LoginForm按Ok),按F9运行。
不用手工切换输入法是不是很方便?以上在Delphi 2.0 ,3.0 上通过。
Winsight32我已经用过了,它的消息太多了,看不过来@_@
我在msdn里也查过,也没查到,还请chechy等大虾指点一二
---- Borland Delphi 以 其 强 大 的 功 能 及 和 高 效 的 可 视 化 开 发 环 境 为 广 大 程 序 设 计 员 所 青 睐 。 尤 其 是 它 封 装 了WINDOWS API 函 数, 能 方 便 地 利 用WINDOWS 资 源大 大 加 快 了 程 序 开 发 速 度。
---- 在 平 时 的 计 算 机 操 作 中中 文 输 入 是 不 可 避 免 的。 使 用 者 可 能 喜 欢 不 同 的 中 文 输 入 法(inputmethod editor简 称IME)这 就 不 得 不 经 常 点 击 任 务 栏 中 的 中 文 图 标 或 用CTRL+SpaceCTRL+Shift 热 键 切 换初 学 者 用 起 来 很 不 方 便。 针 对 这 一 问 题, 可 以 在 开 发 软 件 时在 程 序 中 设 置 用 户 喜 欢 的 中 文 输 入 法方 便 用 户 的 使 用。Delphi 中 只 有 少 数 控 件 如TEdit 支 持IME而 且 该 功 能 不 强不 能 在 运 行 时 更 改 输 入 法。
---- 笔 者 通 过 实 践 和 摸 索查 找 了 相 关 的IME 资 料利 用 了WINDOWS API 函 数实 现 了IME 的 功 能。
---- 常 用 函 数 有:
API函数:BOOL ImmSimulateHotKey(HWND hWndDWORD dwHotKeyID);//模拟热键其中Hwnd为程序窗口的句柄dwHotHKeyID为模拟的热键若成功则返回True
HKL GetKeyboardLayout(DWORD dwLayout);//获得当前键盘状态
BOOL ImmIsIME(HKL hKL);//判断当前是否处于中文输入状态若是则返回True自定义函数:打开相应输入法:OpenIme(imename:string)
例OpenIme('全拼输入法');关闭中文输入法:CloseIme;
以下是一个简单的例子,仅起参考作用。
使用时uses中加上imm
具体的实现方法及源代码如下:unit Unit1;
interface
usesWindowsMessagesSysUtilsClasses
GraphicsControlsFormsDialogs
StdCtrlsButtonsimm;
typeTForm1 = 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;
varForm1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FormShow(Sender: TObject);varj:integer;beginfor j:=0 to screen.imes.count-1 dobeginComBoBox1.Items.Add(screen.Imes.strings[j]);//获取系统中已安装的中文输入法end;end;
procedure Tform1.OpenIme(imename:string);varI:integer;myhkl:hkl;beginif ImeName<>'' thenbeginif Screen.Imes.Count<>0 thenbeginI:=screen.Imes.indexof(imename);if I>=0 thenmyhkl:=hkl(screen.Imes.objects[i]);activatekeyboardlayout(myhkl
KLF_ACTIVATE);//设置相应的输入法end;end;end;
procedure TForm1.closeime;varmyhkl:hkl;beginmyhkl:=GetKeyBoardLayOut(0);if ImmIsIME(myhkl) then//判断是否在中文状态若是则关闭它immsimulateHotkey(handle
IME_CHotKey_IME_NonIME_Toggle);end;
procedure TForm1.ComboBox1Change(Sender: TObject);beginOpenIme(ComboBox1.Text);end;
procedure TForm1.BitBtn1Click(Sender: TObject);beginimmsimulateHotkey(handle
IME_CHotKey_shape_Toggle);//切换半角和全角模式end;
procedure TForm1.BitBtn2Click(Sender: TObject);beginimmsimulateHotkey(handle
IME_CHotKey_symbol_Toggle);//切换中文标点模式和英文标点模式end;
procedure TForm1.BitBtn3Click(Sender: TObject);begincloseime;end;
end.
---- 本 程 序 在Delphi 3.0/4.0 下 通 过
你不停去用FINDWINDOW()找输入法的窗口啊
切换输入法:
关注
lxl(蚊蚊)这种办法我是绝不会用的,太耗资源了,
to all
我用Winsight32好象已经找到了那两个消息了,WM_IME_SETCONTEXT,WM_IME_NOTIFY,还在研究中,有结果一定告诉大家