最近博主遇到一个很奇怪的问题:

CreateWindow(   //edit控件"edit","",WS_VISIBLE | WS_CHILD | WS_BORDER/*|DT_CENTER*/ | DT_VCENTER,100, 70, 100, 25,hWnd,NULL,NULL,NULL);

创建了一个edit控件,看起来没有什么问题,运行一下:

会发现无论怎样敲击键盘,Edit都不会接收键盘输入的字符,经过博主的调试以及摸索发现:EDIT控件只接受WM_CHAR字符消息,而不是WM_KEYDEMO这样的虚拟键代码消息,所以我们需要在消息循环函数里使用:

TranslateMessage来将虚拟键代码消息转换成WM_CHAR消息派发出去:

// 获取消息while (GetMessage(&msg, NULL, 0, 0)) // 当接收到WM_QIUT消息时,GetMessage函数返回0,结束循环{TranslateMessage(&msg);DispatchMessage(&msg); // 派发消息,到WindowPro函数处理}

再次运行就发现可以输入了:

但是还有一个问题,是博主没有加TranslateMessage的时候使用输入法汉字模式下可以输入,原因在于:当我们把焦点放到一个窗体或控件上的时候,按下键盘上的任何按键,输入法会自动获取焦点窗口句柄,然后将我们所按下的每一个按键在自己的汉字库里面寻找,将结果保存成一个链表,每一个汉字没有具体的ascii码表的对应,因为编码的不同,比如:

gb2312:

high8 = 0xa1-->0xfe (161 - 254)

low8 = 0xa1-->0xfe  (161 - 254)

gbk:

high8 = 0x80-->0xfe (128 - 254)

low8 = 0x40-->0xfe (64 - 254)

比如你的系统使用的汉字编码是gbk,那么你就要发送两次,第一次发送高位,第二次发送低位即可!

而edit控件会根据编码的不同来接受不同的字符信息,但是edit每次只能处理wm_char消息一次,当我们发送汉字的时候需要两次,但是汉字对应的ascii码不在英文的ascii码的对应表里,所以edit会认为这是一个汉字,就等待下一次的接受,下一次接受的数据会在编码表里寻找对应的编码,如果长时间没有收到则会视为无效ascii 码,打印出未知的字符!

但是如果你的系统是unicode(包含utf-16)编码(宽字节底层也是这种编码),一次发完即可!

这里在补充一个小知识,那就是每个键盘的键代码可能不一样,也就是扫描码,当出厂商在制作键盘时,每按下一个按键,都会修改指定寄存器里的值,这个值里面包含了键代码,但是有的键代码可能不一样,所以诞生了驱动文件来告诉操作系统键代码对应什么键!

Windows核心编程_Edit控件无法输入问题相关推荐

  1. Windows核心编程_Edit操作

    今天午饭时间无聊,顺手写了几个对Edit控件操作的函数,都是消息处理,有需要的可以拿去学习,非常简单 //EDIT操作 //写 void settxt(HWND hwnd,char* str) {Se ...

  2. Windows核心编程 第27章 硬件输入模型和局部输入状态

    第27章 硬件输入模型和局部输入状态 这章说的是按键和鼠标事件是如何进入系统并发送给适当的窗口过程的.微软设计输入模型的一个主要目标就是为了保证一个线程的动作不要对其他线程的动作产生不好的影响. 27 ...

  3. DLL基础——Windows核心编程学习手札之十九

    DLL基础 --Windows核心编程学习手札之十九 Windows API中的所有函数都包含在DLL中,3个最重要的DLL是Kernel32.dll,它包含用于管理内存.进程和线程的各个函数:Use ...

  4. Windows核心编程之核心总结(第一章 错误处理)(2018.5.26)

    前沿 学习Windows核心编程是步入Windows编程殿堂的必经之路,2018年寒假重温了计算机操作系统知识,前阵子又过学习Windows程序设计方面的基础,正所谓打铁要乘热,所以我又入了Windo ...

  5. [笔记]Windows核心编程《十九》DLL基础

    系列文章目录 [笔记]Windows核心编程<一>错误处理.字符编码 [笔记]Windows核心编程<二>内核对象 [笔记]Windows核心编程<三>进程 [笔记 ...

  6. C++Windows核心编程读书笔记(转)

    http://www.makaidong.com/(马开东博客) 这篇笔记是我在读<windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的 ...

  7. [C++]《Windows核心编程》读书笔记

    这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对实现的推断,因此不少条款和Windows实际机制可能有出入 ...

  8. chHANDLE_DLGMSG(windows核心编程)讲解

    看完<Windows程序设计>后开始看<windows核心编程>, 结果看第一个案例的时候就很惊人的发现,Jeffery大牛的代码很深奥.乍一看好像没有包含<window ...

  9. [笔记]Windows核心编程《二十》DLL的高级操作技术

    系列文章目录 [笔记]Windows核心编程<一>错误处理.字符编码 [笔记]Windows核心编程<二>内核对象 [笔记]Windows核心编程<三>进程 [笔记 ...

最新文章

  1. 5000量子比特的商用计算平台发布!D-Wave:这是商业应用的唯一选择
  2. 单片机I/O口推挽输出与开漏输出的区别(open-drain与push-pull)
  3. oracle外键有什么用,深入理解Oracle索引(20):外键是否应该加索引
  4. Node.js跨域请求解决方案
  5. linux内核syscall_define6,linux中添加系统调用
  6. python模块-re模块
  7. day07 深浅拷贝
  8. C# ffmpeg工具将视频转为SWF格式
  9. Flash builder4 插件版破解
  10. 用java代码怎样做pos结算_Java Tile.Pos方法代码示例
  11. Vue3.0 项目启动(打造企业级音乐App)
  12. C++(数据结构与算法):56---无权图与有权图的编码实现
  13. 职业学校计算机专业好吗,计算机专业就业前景好不
  14. 使用思博伦卫星导航模拟器GSS7000方法
  15. Equalize Them All
  16. Hive2 beeline 使用方法
  17. 很不错的PERL管道应用
  18. 让你低调的app脱颖而出
  19. 图像篡改数据集CASIA 1.0分享 001
  20. 精选收集50个计算机热门视频教程免费下载

热门文章

  1. java 获取当前时分_java实现获取当前年、月、日 、小时 、分钟、 秒、 毫秒
  2. CentOS 7 使用ip addr查询不到IP
  3. 效率 用div做表格和tr_头一次见用电钻做电线接线,效率高出十倍,用几十年都不漏电...
  4. android duiqi文字底部,Android中的文本/布局对齐(textAlignment,gravity)
  5. windows7安装python 无法启动程序_教您解决应用程序无法正常启动(0xc000007b)
  6. 熊乃学 计算机,信息工程学院 - 副本.pdf
  7. 螺旋传动设计系统lisp_[罗升机电]第236期 丝杆升降机系统工程之齿轮传动的设计!...
  8. 手机信令数据怎么获得_手机信令数据辅助下的张江科学城职住分析及对策 | 上海城市规划...
  9. html刘海屏高度,iphone刘海屏网页适配方法
  10. python解常微分方程龙格库_求解常微分方程组初值问题的龙格库塔法分析及其C代码...