首页
社区
课程
招聘
[讨论]TranslateMessage的作用
发表于: 2015-9-30 16:28 10144

[讨论]TranslateMessage的作用

2015-9-30 16:28
10144
一般的消息循环是这样写的
while (GetMessage(&msg, NULL, 0, 0))
        {               
                 TranslateMessage(&msg);
                  DispatchMessage(&msg);
               }
下边这段话是MSDN对TranslateMessage的解释,

The TranslateMessage function translates virtual-key messages into character messages. The character messages are posted to the calling thread's message queue, to be read the next time the thread calls the GetMessage or PeekMessage function.

TranslateMessage函数把虚拟键消息转换成字符消息,该字符消息被送到正在被调用的线程消息列队,并在这个线程下一次调用 GetMessage 或PeekMessage 时被读出;

这就是说TranslateMessage并不改变msg结构里的数据,而 TranslateMessage执行完了以后马上又调DispatchMessage(&msg); 那么窗口过程收到的消息根本与TranslateMessage无关

其次,TranslateMessage将消息传回消息列队,那么本来被GetMessage清空的消息列队又被TranslateMessage填满,系统以后传过来的消息没地方放,程序为什么不卡死

再有TranslateMessage把消息放到消息列队,GetMessage又从消息列队把这个消息拿出来,然后又再传给TranslateMessage,TranslateMessage又把它放到消息列队,这不是再绕圈圈吗,而这个消息在这里翻译来翻译去,翻译到最后会翻译出个什么东东来?微软的是不是疯子啊

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 69
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
WM_KEYDOWN和WM_KEYUP组合产生一个WM_CHAR或WM_DEADCHAR消息。
WM_SYSKEYDOWN和WM_SYSKEYUP组合产生一个SYSWM_CHAR或 WM_SYSDEADCHAR消息。TtanslateMessage为那些由键盘磁碟机映射为ASCll字元的键产生WM_CHAR消息。

---
写得有点乱,因为我是随便从某个地方copy-paste的。
2015-9-30 16:37
0
雪    币: 108
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不对啊,TranslateMessage的参数是&msg,参里面只有一个消息,怎么合啊
2015-9-30 17:03
0
雪    币: 5461
活跃值: (1410)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼主的学习精神是值的肯定的,但这感觉有点钻牛角尖了,从楼主目前的现状,了解了这个函数的功能就行了,等你以后成为大牛的时候,可以再深入的去研究他是怎么把keydown和keyup合成一个消息的。
2015-9-30 22:24
0
雪    币: 108
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
好吧好吧
2015-10-1 06:16
0
雪    币: 272
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
TranslateMessage 并不会抛弃 WM_KEYDOWN 之类的消息,应该是翻译后插入到WM_KEYUP后面,所以在消息处理时能接收到  WM_KEYDOWN WM_KEYUP 然后是WM_CHAR
2015-10-1 15:55
0
雪    币: 209
活跃值: (19)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
Mark一下,这个问题希望有人挖一下,交给新人吧,挖一挖你就升级了
2016-5-22 00:16
0
雪    币: 335
活跃值: (160)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8

我的实验如下:
1.装一个全局低级钩子WH_KEYBOARD_LL,每一次按键能钩到一对wparam为WM_KEYDOWN/KEYUP的消息.  将钩到消息的lparam强转为KBDLLHOOKSTRUCT,其中包含成员变量KBLLHOOKSTRUCT.vkCode,  这个就是msdn中所说的'virtual-key-code'. 
如果钩到的消息是被translate过的,那么钩到的应该是一个合并的character  message,而不是一对。
如果钩到的消息是被translate过的,那么钩到的消息的wparam应该是按键的ASCII码,而不是WM_KEYDOWN/KEYUP。
由此推断,WH_KEYBOARD_LL钩到的是translate之前的消息。
2.装一个全局高级钩子WH_KEYBOARD,每一次按键只能钩到一个WM_CHAR消息。打印钩到消息的wparam,其值为按键的ASCII码。
由此推断,WH_KEYBOARD钩到的是translate之后的消息。

2017-7-4 09:20
0
游客
登录 | 注册 方可回帖
返回
//