一、WM_CHAR

1、如果窗口是unicode(IsWindowUnicode),WM_CHAR的wParam就是unicode字符。

2、如果窗口式ANSI,WM_CHAR的wParam是一个单字节的值。如果输入中文,则会得到2个WM_CHAR,把这两个单字节值合到一起就是输入的中文。

二、有一个额外的WM_UNICHAR,里面的wParam总是unicode32,但观察发现,输入法似乎并不用这个消息。如果其他程序想用这个消息给一个ANSI窗口发送消息,则应该先发一个WM_UNICHAR,并且wParam是UNICODE_NOCHAR,并且返回1。如果程序不处理,DefWndProc会返回0。如果输入法得到1,则认为该程序支持此消息,如果得到0,则认为该程序不支持此消息。如果是unicode window,DefWndProc会将WM_UNICHAR转换为WM_CHAR重新发出,如果是ansi,则会转换为1个或者2个WM_CHAR发出。

三、WM_IME_CHAR

1、如果是unicode window,则wParam就是unicode字符,此时和WM_CHAR没有任何区别。

2、如果是ansi window,则wParam是双字节的mbc编码。

如果程序忽略此消息,DefWndProc会转换为WM_CHAR(unicode window),或者1~2个WM_CHAR(ansi window)。注意一个细节,如果A要给B窗口发送WM_IME_CHAR,则应该postmsg(wm_ime_char,L’阿’,1),而不是postmsg(wm_ime_char,’阿’,1);如果B窗口是unicode窗口,则wParam=L”阿”。如果B窗口是ANSI窗口,则收到的wParam是’阿’,而不是L’阿’。这个转换甚至早于PreTranslateMessage。不知道系统在何时进行的转换。如果对ANSI窗口postmsg(wm_ime_char,’阿’,1),有时候也可以工作,但CEdit是不工作的。

也就是说,一般来说,如果是接收方,则不需要处理WM_IME_CHAR,直接交给DefWndProc即可。如果要处理,如果是unicode window,则和WM_CHAR处理方式一样,如果是ansi window,则需记住这个wParam是2个字节的MBC编码:

char Buffer[3] ={0};
Buffer[0] = wParam>>8;
Buffer[1] = (UCHAR)wParam;
Buffer[2] = 0;

如果是发送消息方,则应该总是使用wParam = unicode_char。

四、IME(Input Method Editor,输入法编辑器,简称输入法)的消息流程:

当用输入法输入时,首先发送WM_IME_COMPOSITION消息,在这个消息处理中,可以用ImmGetCompsitionString得到输入的字符串。如果不处理,则DefWndProc会针对每个字符串重新发送WM_IME_CHAR,如果WM_IME_CHAR也未处理,则DefWndProc会再次发送WM_CHAR。

假设用输入法输入“阿布”,

如果unicode window,则首先WM_IME_COMPOSITION,ImmGetCompsitionString得到的是2个unicode的wchar_t。然后2次WM_IME_CHAR,然后2次WM_CHAR。

如果ansi window,则首先WM_IME_COMPOSITION,ImmGetCompsitionString得到的是2个MBC的wchar_t。然后2次WM_IME_CHAR,然后4次WM_CHAR。

//游戏中这样处理

case WM_CHAR:
case WM_SYSCHAR:
{
char cChar = (char)wParam;
printf( "汉字输入\n" );
static bool m_bDoubleChar = false;
static char m_sInpub[2] = { 0 };
if (m_bDoubleChar)
{
m_sInpub[1] = cChar;
printf( "%s\n", m_sInpub );
m_bDoubleChar = false;
m_sInpub[0] = 0;
m_sInpub[1] = 0;
}
else
{
if (IsDBCSLeadByte( cChar ))
{
//是双字节
m_bDoubleChar = true;
m_sInpub[0] = cChar;
}
else if (( cChar >= 32) && ( cChar <= 255))
{
m_sInpub[0] = cChar;
m_sInpub[1] = 0;
}
}
}

break;

转载自:http://st251256589.blog.163.com/blog/static/1648764492012013103021772/

WM_CHAR,WM_UNICHAR,WM_IME_CHAR相关推荐

  1. Android多点触控详解

    本文转载自GcsSloop的 安卓自定义View进阶-多点触控详解 的文章 Android 多点触控详解,在前面的几篇文章中我们大致了解了 Android 中的事件处理流程和一些简单的处理方案,本次带 ...

  2. React中的SVG陷阱

    react svg When we want to use SVG image in React, we may import it like this: 当我们想在React中使用SVG图像时,我们 ...

  3. svg react_React中的SVG陷阱

    svg react When we want to use SVG image in React, we may import it like this: 当我们想在React中使用SVG图像时,我们 ...

  4. 发送候选文字到光标所在位置

    输入法发送候选文字到光标所在处是怎么做到的? 这个问题折磨我将近半个月,今天终于搞定,分享下 用spy++可以捕获当我们当输入完文字按空格时,输入法调用哪些windows消息机制来完成文字从输入法候选 ...

  5. 如何做CEdit中的Undo,Redo(和word类似的输入法输入一次为一个回退块)

    注:因为懒了,所以只将自己发的帖子的内容Copy出来了,没有整理(http://topic.csdn.net/u/20100816/15/6232364a-ebeb-4bf6-903c-1a3012c ...

  6. (转)VC IMM/IME输入法编程

    输入法编辑器篇 输入法编辑器(IME)是允许用户使用标准键盘输入复杂字母与符号,如日文汉字的程式.本文描述创建及管理IME(input method editor)视窗的方法. 1.输入法编辑器简介 ...

  7. 如何使对话框中接收到WM_CHAR消息(Windows编程)

    我们大家都知道,对话框是有的时候捕获不到WM_CHAR消息的.比如,你想使对话框里的Edit控件所键入的全部变为大写.我们毫不犹豫的写到:    #include //Declare the Dial ...

  8. WM_CHAR、WM_KEYDOWN和WM_SYSKEYDOWN消息

    WM_KEYDOWN和WM_CHAR都是键盘消息.TranslateMessage函数已经将按键消息转换成字符消息了,那么WndProc函数中需要对事件进行选择.如:键入"D"键, ...

  9. WM_CHAR,WM_KEYDOWN和WM_SYSKEYDOWN

    WM_KEYDOWN和WM_CHAR都是键盘消息.TranslateMessage函数已经将按键消息转换成字符消息了,那么WndProc函数中需要对事件进行选择.如:键入"D"键, ...

最新文章

  1. R语言plotly可视化:使用PCA算法进行数据降维、使用plotly可视化PCA所有的主成分绘制散点图矩阵、降维后的两个(三个)核心主成分的二维、三维可视化图形、方差解释的量、载荷图等
  2. 如何利用扬声器构建深度学习网络?
  3. require和require_once的区别
  4. Web开发者必备的12款超赞jQuery插件
  5. python脚本报错:OSError: [WinError 193] %1 不是有效的 Win32 应用程序。
  6. 【三石jQuery视频教程】02.创建 FontAwesome 复选框和单选框
  7. 关于OBS录制win10视频,全屏卡顿的问题
  8. Python 实现Tracert追踪TTL值
  9. 搜狗语音云开发入门(二)——使用离线语音识别服务
  10. mac转换pin计算机,MAC对应PIN码表-2012.3.4整理
  11. kettle点击spoon.bat打不开
  12. 技术类岗位面试中经典问题总结分享
  13. 【Postman】使用Tests进行环境变量设置
  14. IOS 代码修改故事版中的自动布局参数
  15. pandas数据合并之pd.concat()用法
  16. 用树莓派控制两盏灯(二)
  17. 浴室预约微信小程序的设计与实现
  18. 浅谈分布式架构搭建-理论知识
  19. dpdk-20.11 编译和安装
  20. 用c语言a的n次再取p的余数,近世代数期末考试题库

热门文章

  1. Spring Boot 分布式事物管理
  2. 历届蓝桥杯Scratch编程国赛 初级 中级 青少年编程比赛国赛真题解析【持续更新 已更新至27题】
  3. 龟叔 python_Python 三十而立
  4. a[i]-‘0‘与(int)a[i]区别
  5. 解决同一路由,不同参数报Navigating to current location ***** is not allowed 问题
  6. 斗地主命令版本php,命令行版的斗地主你玩过没?
  7. 无线路由器连接交换机
  8. JVM语言Xtend优缺点速览
  9. JavaScript 笔记之数组
  10. [oeasy]python0125_汉字打印机_点阵式打字机_汉字字形码