今天遇到的一个输入法全/半角的问题,大致情形如下:用户注册界面中对用户名及邮箱进行验证、验证条件中有一项为“半角字符”,即全角字符不合法。

并且验证错误时的提示信息也做的比较粗糙,提示的是什么“用户名允许…字符,长度是多少 ”等等,而恰好没有提示到“半角字符”。

这时候某用户开始了一遍又一遍输入他那全角的英文字符,然而总是注册失败,弄的很郁闷。

唉,用户交互没做好啊!再言之:WinForm里用错误提示大多还是用那种“小红圈”[ErrorProvider],错误提示文本被隐藏了,不能被用户直接看到。
还有当时他似乎也没有看错误提示信息哦。仔细想想 这是用户的错吗? 似乎也不能责怪用户吧!

既然遇到问题了,那就解决吧。

解决思路:当满足以下三个条件中任意一个时便自动将输入法状态改为半角。
1、窗体Activated 事件发生时。
2、Form_Keyup 事件,按下Ctrl + Space时。
3、Form_KeyUp 事件,按下Shift+Space时,呵呵,这样做似乎不太好。

这样做基本上就可以保证用户输入法状态为半角了,不知是否还有疏漏呢?

至于将输入法状态改为半角,我们有相关的API可以调用。
为了使用方便,特将这些封装到工具类中,现与大家分享。

   public class ControlTools    {// 声明一些API函数           [DllImport("imm32.dll")]public static extern IntPtr ImmGetContext(IntPtr hwnd);        [DllImport("imm32.dll")]public static extern bool ImmGetOpenStatus(IntPtr himc);
        // 暂时没有用到,觉得这个API似乎有问题。        [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;

private Form mFrm;

public ControlTools(Form frm)        {this.mFrm = frm;        }
        // 输入法全角转半角public void FullToHalf()        {this.mFrm.KeyPreview = true;this.mFrm.Activated += new EventHandler(mFrm_Activated);this.mFrm.KeyUp += new KeyEventHandler(mFrm_KeyUp);        }

private void mFrm_KeyUp(object sender, KeyEventArgs e)        {if ((e.Control || e.Shift) && e.KeyCode == Keys.Space)            {this.mFrm_Activated(null, null);            }        }

private void mFrm_Activated(object sender, EventArgs e)        {try            {                IntPtr HIme = ImmGetContext(this.mFrm.Handle);// 如果输入法处于打开状态                if (!ImmGetOpenStatus(HIme))                {return;                }

int iMode = 0;int iSentence = 0;// 检索输入法信息                   bool bSuccess = ImmGetConversionStatus(HIme, ref   iMode, ref   iSentence);if (bSuccess)                {// 如果是全角,转换成半角                      if ((iMode & IME_CMODE_FULLSHAPE) > 0)                    {                        ImmSimulateHotKey(this.mFrm.Handle, IME_CHOTKEY_SHAPE_TOGGLE);                    }                }            }catch (Exception ex)            {                Console.WriteLine(ex.Message);            }        }    }

输入法——讨厌的全角相关推荐

  1. 彻底关闭 输入法 讨厌的全角

    win7 平台 转载于:https://blog.51cto.com/990487026/1874181

  2. 输入法中的全角和半角

    遇到的问题 刚刚在使用输入法(微软拼音),不小心按了貌似是Shift+空格,然后打英文就变成了这样abcdefg,看着像有空格是吧,实际上我打的这个几个字母都是连续的 原因 经过了解才知道半角和全角的 ...

  3. 输入法中的全角与半角

    问:输入法为什么有全角半角之分 这要从发展史说起: 1. 二进制 计算机普遍遵循冯诺依曼结构体系,它规定了计算机内部以二进制为主要数制(这和电路有关),所以计算机只认识二进制的0或1.其它符号比如十进 ...

  4. 输入法半角和全角的快捷转换_日语输入法究极指南

    阅读数:53396 ​​·清音(以平假名为例,片假名是一样的) あ a い i う u え e お o か ka き ki く ku け ke こ ko さ sa し shi す su せ se そ ...

  5. 输入法中的全角和半角是什么,角又是什么

    角是日语的角,不是中文的角,这里的意思是四边形,日语叫四角形,也有道理,有四个角嘛. 全角就是这个四边形是完全的,也就是方的,中文的字正好是方的. 半角就不用多说了,就是半个四边形,普通的英文字母正好 ...

  6. 输入法半角和全角的快捷转换_华宇拼音输入法 一款完全免费的国产输入法_第1页...

      华宇拼音输入法历史追溯   "华宇拼音输入法"是华宇自主研发的一款文字输入软件,其历史可以追溯到二十多年前.   1999年 华宇拼音输入法初入江湖,前身是李国华博士编写的&q ...

  7. 输入法半角和全角的快捷转换_Windows 10—禁用Ctrl+Space输入法非输入法切换

    问题 Windows 10 默认使用"Ctrl+Sapce"快捷键来开启或禁用中文输入法,如下图,并且这个快捷键怎么修改也无效.这个影响很多软件快捷键的使用. 解决方法 更新: 修 ...

  8. Windows10系统自带输入法如何切换全角/半角字符

    有些时候因为测试需要,所以需要区分输入的全角字符和半角字符. 全角字符是指一个字符占据俩个标准字符的位置. 半角字符是指一个字符占据一个标准字符的位置. 一个字符是一个字节. 一个字节是8个比特位. ...

  9. Win10 取消百度输入法 Shift+Space 全角半角切换

    问题描述 在百度输入法中,按下shift+空格,会自动进行全角与半角切换,这会导致在敲代码时 写着写着就出现以下情况: #include <iostream> using namespac ...

最新文章

  1. keras 的 example 文件 deep_dream.py 解析
  2. java----代理机制或动态类的生成
  3. 考前多熟记的知识点(1)~(3)《系统集成项目管理工程师软考辅导》
  4. 基于 Knative 低成本部署在线应用,灵活自动伸缩
  5. C#Socket开发TCP详解(二)
  6. 世纪佳缘,玫瑰和面包开始PK
  7. dbms_metadata.get_ddl的使用总结
  8. 【渝粤题库】陕西师范大学202421 教育管理心理学 作业 (专升本)
  9. goim 中的 data flow 数据流转及思考
  10. Ansible8:Playbook循环
  11. 数据结构与算法之-----总览
  12. 16进制转base64_《蹲坑学K8S》之19-5:二进制部署Calico网络
  13. Atitit 数据库view视图使用推荐规范与最佳实践与方法
  14. VS2008个人博客系统
  15. python之爬取中华诗词网
  16. 计算机组成原理定点源码一位乘,计算机组成原理课程设计-定点原码一位乘法器的设计.doc...
  17. 适配层java接口_Linux Framebuffer适配层释疑
  18. python合并单元格的快捷键是什么_【答疑】wps word表格如何合并单元格,快捷键是什么? - 羽兔网问答...
  19. 数据分析 | 多元线性回归
  20. 解决办法之Duplicate entry ‘1‘ for key ‘PRIMARY‘

热门文章

  1. mysql out返回结果_在MySQL的存储过程的OUT参数中返回结果集
  2. UE3客户端加入DS过程
  3. Swagger生成的接口需要权限验证的处理方法
  4. 在git中出现中文乱码的解决方案
  5. Java中对象的深克隆和浅克隆
  6. 在linux查看内存的大小
  7. vmware中linux无法动态获取dhcp解决方法
  8. python 调试命令
  9. LIST OF CITIES FOR POTENTIAL VISIT IN SOUTHERN UK
  10. Discovery Session