CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  .NET技术 >  C#

为什么输入法状态自动变成全角?

楼主superzxf(superzxf)2006-03-15 12:12:59 在 .NET技术 / C# 提问

做了一个很简单的winform程序,其中的文本框输入汉字时如果当时使用的是半角状态,在没有关闭输入法的情况下关闭该子窗体,等再次打开该子窗体时输入法变成全角状态了 问题点数:20、回复次数:14Top

1 楼hle(老大)回复于 2006-04-17 14:09:54 得分 0

vs2005都有这个问题。  
  把窗体的ImeMode设为'On'即可,偶尔会在第一次切换窗口时出现问题,可能和系统环境有关,手工切换一次后就好了Top

2 楼superzxf(superzxf)回复于 2006-04-20 16:12:54 得分 0

郁闷极了,操作很不方便,vs2005都这样啊,ms有没出什么补丁呀Top

3 楼zhoujijunnt(---)回复于 2006-04-20 16:29:33 得分 0

05的bug,建议到MS的网站上提点意见去Top

4 楼superzxf(superzxf)回复于 2006-04-21 12:29:01 得分 0

郁闷至极,简直骑虎难下啊Top

5 楼moguiziziwenlong(C#学习中,各位帮忙帮忙帮帮忙~~ >_<)回复于 2006-04-21 12:46:24 得分 0

我还用了   2005   没发现过~Top

6 楼diandian82(点点(nothing))回复于 2006-04-21 12:49:53 得分 0

好像英文版没问题吧?Top

7 楼Lucky527(幸运星)回复于 2006-04-21 15:54:24 得分 0

其实这和你的程序无关,和你系统有关,我做过实验,就是到系统的输入法设置中去改变一下默认的输入法(以前为智能ABC)为(简体中文)美式键盘,之后每次再打开这个窗体时就是半角了。  
  总之是你windows系统的输入法设置默认是什么的问题。Top

8 楼xrwang(无涯)回复于 2006-04-21 16:02:47 得分 5

我已经在多台电脑试过了,楼上的说法是错误的。Top

9 楼runrunrun(农妇、山泉、有点田)回复于 2006-04-25 17:37:04 得分 5

我也遇到这个问题了。textbox还好了,但只要一打开Datetimepicker,输入法就会变成全角的Top

10 楼anson2003(老蒋)回复于 2006-04-25 17:57:56 得分 5

我遇到了一样得问题!Top

11 楼superzxf(superzxf)回复于 2006-04-27 14:01:41 得分 0

这个问题烦死了,怎么没有补丁啊Top

12 楼liujiwe79(专业做控件)回复于 2006-04-27 14:09:20 得分 5

靠,手工切换累死了,我也遇到过这个问题Top

13 楼gatr()回复于 2006-05-08 09:49:40 得分 0

这是一个微软的一个大BUG,目前无好的解决办法,我通过如下办法处理:  
  1、新建一个类:ImeForm,该类继承于Form,  
  2、在Load事件中,通过递归循环,查找所有的文本框,处理文本框的Enter事件,自动将输入法转换为半角,当然,如果其他输入控件也有类似问题,无非是在递归循环中多一个判断分支而已.  
  3、将程序中用到的Form的基类由System.Windows.Forms.Form改为ImeForm,如果以后微软解决了这个问题,改回去就可以了,ImeForm的全部代码如下:  
  using   System;  
  using   System.Collections.Generic;  
  using   System.Text;  
  using   System.Windows.Forms;  
  namespace   Lqjt  
  {  
          ///   <summary>  
          ///   解决输入法全角的问题  
          ///   </summary>  
          public   class   ImeForm   :   System.Windows.Forms.Form    
          {  
                  ///   <summary>  
                  ///   做一个标记,避免重复设置Enter事件  
                  ///   </summary>  
                  private   bool   m_AttachProcessed   =   false;  
                  ///   <summary>  
                  ///   在Load事件中遍历控件,如果是文本框,自动切换到半角状态  
                  ///   </summary>  
                  ///   <param   name="e"></param>  
                  protected   override   void   OnLoad(EventArgs   e)  
                  {  
                          base.OnLoad(e);  
                          if   (!m_AttachProcessed)  
                          {  
                                  SetImeToHangul(this.Controls);  
                                  m_AttachProcessed   =   true;  
                          }  
                  }  
   
                  ///   <summary>  
                  ///   通过递归,遍历当前窗口的全部控件  
                  ///   </summary>  
                  ///   <param   name="p_Controls">容器</param>  
                  private   void   SetImeToHangul(System.Windows.Forms.Control.ControlCollection   p_Controls)  
                  {  
                          foreach   (System.Windows.Forms.Control   ctl   in   p_Controls)  
                          {  
                                  FlowLayoutPanel   flpan   =   ctl   as   FlowLayoutPanel;  
                                  if   (flpan   !=   null)  
                                  {  
                                          SetImeToHangul(flpan.Controls);  
                                          continue;  
                                  }  
                                  GroupBox   grp   =   ctl   as   GroupBox;  
                                  if   (grp   !=   null)  
                                  {  
                                          SetImeToHangul(grp.Controls);  
                                          continue;  
                                  }  
   
                                  Panel   pan=   ctl   as   Panel;  
                                  if   (pan   !=   null)  
                                  {  
                                          SetImeToHangul(pan.Controls);  
                                          continue;  
                                  }  
                                  TabControl   tabcontrol   =   ctl   as   TabControl;  
                                  if   (tabcontrol   !=   null)  
                                  {  
                                          SetImeToHangul(tabcontrol.Controls);  
                                          continue;  
                                  }  
                                  TabPage   tabpage   =   ctl   as   TabPage;  
                                  if   (tabpage   !=   null)  
                                  {  
                                          SetImeToHangul(tabpage.Controls);  
                                          continue;  
                                  }  
                                  TableLayoutPanel   tlpan   =   ctl   as   TableLayoutPanel;  
                                  if(tlpan!=null)  
                                    {  
                                            SetImeToHangul(tlpan.Controls);  
                                          continue;  
                                  }  
                                  //文本框进入时,自动切换到半角,如果要控制其他可输入控件,参照下面的代码完成  
                                  TextBox   txtbox   =   ctl   as   TextBox;  
                                  if   (txtbox   !=   null)  
                                  {  
                                          txtbox.Enter   +=   new   EventHandler(ControlEnter_Enter);  
                                  }  
                        }  
                  }  
                  private     void   ControlEnter_Enter(object   sender,   EventArgs   e)  
                  {  
                          Control   ctl   =   sender   as   Control;  
                          if   (ctl   ==   null)  
                                  return;  
                          if   (ctl.ImeMode   !=   ImeMode.Hangul)  
                                  ctl.ImeMode   =   ImeMode.Hangul;  
                  }  
          }//class  
  }  
  Top

14 楼gatr()回复于 2006-07-01 08:21:38 得分 0

根据网上内容,我又重新修改了ImeForm,修改后的效果更好,解决了在NumbericUpDown以及用户通过Ctrl+Shift切换不能变半角的问题,新的如下:  
  using   System;  
  using   System.Collections.Generic;  
  using   System.ComponentModel;  
  using   System.Data;  
  using   System.Drawing;  
  using   System.Text;  
  using   System.Windows.Forms;  
  using   System.Runtime.InteropServices;  
   
  namespace   Lqjt  
  {  
          public   partial   class   ImeForm   :   Form  
          {  
                  public   ImeForm()  
                  {  
                          InitializeComponent();  
                  }  
                  //声明一些API函数  
                  [DllImport("imm32.dll")]  
                  public   static   extern   IntPtr   ImmGetContext(IntPtr   hwnd);  
                  [DllImport("imm32.dll")]  
                  public   static   extern   bool   ImmGetOpenStatus(IntPtr   himc);  
                  [DllImport("imm32.dll")]  
                  public   static   extern   bool   ImmSetOpenStatus(IntPtr   himc,   bool   b);  
                  [DllImport("imm32.dll")]  
                  public   static   extern   bool   ImmGetConversionStatus(IntPtr   himc,   ref   int   lpdw,   ref   int   lpdw2);  
                  [DllImport("imm32.dll")]  
                  public   static   extern   int   ImmSimulateHotKey(IntPtr   hwnd,   int   lngHotkey);  
                  private   const   int   IME_CMODE_FULLSHAPE   =   0x8;  
                  private   const   int   IME_CHOTKEY_SHAPE_TOGGLE   =   0x11;  
                  protected   override   void   OnActivated(EventArgs   e)  
                  {  
                          base.OnActivated(e);  
                          IntPtr   HIme   =   ImmGetContext(this.Handle);  
                          if   (ImmGetOpenStatus(HIme))     //如果输入法处于打开状态  
                          {  
                                  int   iMode   =   0;  
                                  int   iSentence   =   0;  
                                  bool   bSuccess   =   ImmGetConversionStatus(HIme,   ref   iMode,   ref   iSentence);     //检索输入法信息  
                                  if   (bSuccess)  
                                  {  
                                          if   ((iMode   &   IME_CMODE_FULLSHAPE)   >   0)       //如果是全角  
                                                  ImmSimulateHotKey(this.Handle,   IME_CHOTKEY_SHAPE_TOGGLE);     //转换成半角  
                                  }  
   
                          }  
                  }  
          }//form  
  }Top

相关问题

  • 急!!输入法状态栏不见了?
  • 当某文本框获得焦点时,输入法由汉字输入法转换为英语状态下
  • 如何能够得到其他程序的输入法状态!
  • 如何在程序中控制输入法的状态
  • 微软输入法的状态条跑了
  • XP输入法中英文标点状态的问题
  • windowsxp 怎么让默认的输入法变成中文?
  • 在delphi 程序中如何控制输入法的全半角?
  • 如何在VB中用API随意控制输入法的开关状态。
  • 一个小问题,在2000/XP下输入法的状态栏怎么调出来?

关键词

  • vs2005
  • 输入法
  • 控件
  • 系统
  • 解决
  • setimetohangul
  • 半角
  • 文本框
  • imeform
  • 窗体

得分解答快速导航

  • 帖主:superzxf
  • xrwang
  • runrunrun
  • anson2003
  • liujiwe79

相关链接

  • CSDN .NET频道
  • .NET类图书
  • C#类图书
  • .NET类源码下载

广告也精彩

反馈

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