CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  VCL组件开发及应用

怎么知道用户是否调用输入法,切换输入法

楼主geliang(回来的光芒)2001-11-14 14:01:58 在 Delphi / VCL组件开发及应用 提问

如题,先给50,解决了再加.  
                                                          geliang 问题点数:50、回复次数:11Top

1 楼chechy(www.qdocuments.net)回复于 2001-11-14 14:21:08 得分 10

你不妨用Winsight32跟踪一下,看看切换输入法会触发哪些消息。应该是WM_IME_*的某个消息。Top

2 楼cobi(我是小新)回复于 2001-11-14 14:29:03 得分 10

ImmGetConversionStatus(ImmGetContext(GetForegroundWindow),a,b)  
  或  
    TID   :=   GetWindowThreadProcessID(GetForegroundWindow,@PID);  
  MyHkl   :=   GetKeyBoardLayout(TID);Top

3 楼zfmich()回复于 2001-11-14 14:29:50 得分 10

转载  
   
  Delphi实现自动切换输入法  
   
   
  我们在使用   Windows   平台(以下指中文版Windows)的软件时,常常需要输入一些有关信息,有时在一个编辑框内输入中文,而另一个编辑框却要求输入英文,这时我们不得不切换输入法。当我们在录入大量上述条件的数据至数据库时,频繁的切换无疑对速度影响很大,那么能不能在光标落入编辑框内时,就自动切换为所需的输入法呢?答案是肯定的,Delphi中就可以实现。  
   
   
  在delphi中,可直接键入内容的元件都具有ImeMode、ImeName属性,IME为(Input   Method   Editor)的缩写。其中ImeMode   为枚举型变量,取值为(imDisable  
   
  imClose,imOpen,imDontCare,imSAlpha,imAlpha,imHira,imSKata  
   
  imKata,imChinese,imSHanguel,imHanguel)  
   
  默认为imDontCare  
   
  其他几种属性值与本文没有很大关系,内容又多,因此略过。ImeName也是枚举型变量,默认为空,具体取值范围与系统中所装输入法有关,在Delphi启动时,自动检测得变量取值范围,对于中文版Windows而言,智能ABC输入法、全拼输入法都是缺省安装的。  
   
   
  例如:一个用户登录窗口要求输入用户名(中文),口令(英文字母与数字的组合)。假设用户名为“陈理辉”,口令为“student”。设计步骤如下:  
   
   
  新建一窗体,设置其属性为  
   
  Caption:   登录窗口  
   
  Name   LoginForm  
   
  BborderStyle   bsDialog;  
   
  FormStyle:   fsStayonTop  
   
  Position   poScreenCenter  
   
   
  在窗体中放入两个TLabel构件,分别设置为  
   
  Caption   请输入用户名:  
   
  Caption   密码:  
   
   
  在窗体中放入一个TEdit构件,设置为  
   
  Name   UserNameEdtText  
   
  ImeName   智能ABC输入法  
   
   
  在窗体中放入一个TEdit构件,设置为  
   
  Name   PassWordEdt;Text  
   
  PasswordChar   ′*′  
   
   
  放入一个TButton构件,设置为  
   
  Caption   确认(&O)  
   
  Name   OkBtn  
   
   
  双击该构件加入如下代码:  
   
  procedure   TLoginForm.OkBtnClick(Sender:TObject);  
   
  begin  
   
  if   (UserNameEdt.text=′陈理辉′)   and   (PasswordEdt.TExt=′student′)   then  
   
  begin  
   
  ShowMessage(′密码正确,登录成功!′);  
   
  Application.Terminate;  
   
  End  
   
  Else  
   
  ShowMessage(′密码错误,请再试。′);  
   
  end;  
   
   
  放入一个   TButton   构件,设置为  
   
  Caption   取消(&C)  
   
  Name   CancelBtn  
   
   
  双击该构件加入如下代码:  
   
  procedure   TLoginForm.CancelBtnClick(Sender:TObject);  
   
  begin  
   
  Application.Terminate;  
   
  end;  
   
   
  7.将Project存为Login.dpr  
   
  将LoginForm设为主窗口(点Project|Options  
   
  选Forms标签页  
   
  点Main   Form下拉框,选LoginForm  
   
  按Ok),按F9运行。  
   
   
  不用手工切换输入法是不是很方便?以上在Delphi   2.0   ,3.0   上通过。  
  Top

4 楼geliang(回来的光芒)回复于 2001-11-14 14:29:51 得分 0

又要谢谢chechy了  
  Winsight32我已经用过了,它的消息太多了,看不过来@_@  
  我在msdn里也查过,也没查到,还请chechy等大虾指点一二  
  Top

5 楼hzlan(^只有你能帮到我^)回复于 2001-11-14 14:30:10 得分 0

我做了一个,就象任务栏上的一样,不过没有图标显示.Top

6 楼zfmich()回复于 2001-11-14 14:33:33 得分 0

转载  
   
  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;  
   
   
  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]);  
   
  //获取系统中已安装的中文输入法  
   
  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   下   通   过  
  Top

7 楼chechy(www.qdocuments.net)回复于 2001-11-14 14:37:41 得分 0

消息确实很多,所以,我一般都是采用消息过滤的,只跟踪部分消息。这里,需要关注WM_IME_*的消息,所以就跟踪这一部分。Top

8 楼lxl(是我,不是风)回复于 2001-11-14 18:19:20 得分 10

是否调用输入法:  
  你不停去用FINDWINDOW()找输入法的窗口啊  
  切换输入法:  
  关注  
  Top

9 楼zxb2001(zxb)回复于 2001-11-14 18:53:59 得分 10

good  
  Top

10 楼geliang(回来的光芒)回复于 2001-11-15 09:30:38 得分 0

谢谢zfmich(),这篇文章我看过了,但它是指用api来达到改变输入法的,不符合我的要求,  
  lxl(蚊蚊)这种办法我是绝不会用的,太耗资源了,  
  to   all    
      我用Winsight32好象已经找到了那两个消息了,WM_IME_SETCONTEXT,WM_IME_NOTIFY,还在研究中,有结果一定告诉大家  
   
  Top

11 楼Camel_csdn(狗狗)回复于 2002-05-27 20:44:16 得分 0

关注Top

相关问题

  • 调用输入法
  • 输入法切换问题:
  • 输入法无法切换?
  • 如何切换输入法
  • 急!!!jb中的textField输入法切换。
  • 在PB中如何切换输入法
  • 文本框输入法切换!
  • 高分请教:如何在用户切换系统输入法时,主表单及子表单能够捕捉到这一消息
  • 怎么实现调用输入法的操作
  • LINUX下默认有中文输入法吗?如何调用?

关键词

  • 输入法
  • 中文
  • 用户
  • 消息
  • 切换
  • imename
  • bitbtn
  • 构件
  • ime
  • openime

得分解答快速导航

  • 帖主:geliang
  • chechy
  • cobi
  • zfmich
  • lxl
  • zxb2001

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo