TranslateMessage函数

函数功能描述:将虚拟键消息转换为字符消息。字符消息被送到调用线程的消息队列中,在下一次线程调用函数GetMessage或PeekMessage时被读出。

.函数原型:
    BOOL TranslateMessage(  CONST MSG *lpMsg );
.参数:
    lpMsg 
        指向一个含有用GetMessage或PeekMessage函数从调用线程的消息队列中取得消息信息的MSG结构的指针。
.返回值:
    如果消息被转换(即,字符消息被送到线程的消息队列中),返回非零值。
    如果消息是 WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN, 或 WM_SYSKEYUP,返回非零值,不考虑转换。
    如果消息没有转换(即,字符消息没被送到线程的消息队列中),返回值是零。
.备注:
    TranslateMessage函数不修改由参数lpMsg指向的消息。
    消息WM_KEYDOWN和WM_KEYUP组合产生一个WM_CHAR或WM_DEADCHAR消息。消息WM_SYSKEYDOWN和WM_SYSKEYUP组合产生一个WM_SYSCHAR或 WM_SYSDEADCHAR 消息。
    TtanslateMessage仅为那些由键盘驱动器映射为ASCII字符的键产生WM_CHAR消息。
    如果应用程序为其它用途而处理虚拟键消息,不应调用TranslateMessage函数。例如,如果TranslateAccelerator函数返回一个非零值,则应用程序将不调用TranslateMessage函数。
    Windows CE:Windows CE不支持扫描码或扩展键标志,因此,它不支持由TranslateMessage函数产生的WM_CHAR消息中的lKeyData参数(lParam)16-24的取值。
    TranslateMessage函数只能用于转换由GetMessage或PeekMessage函数接收到的消息。 

 

DispatchMessage函数

函数功能:该函数调度一个消息给窗口程序。通常调度从GetMessage取得的消息。消息被调度到的窗口程序即是MainProc()函数。

  函数原型:LONG DispatchMessage(CONST MSG*lpmsg);

  参数:

  lpmsg:指向含有消息的MSG结构的指针。

  返回值:返回值是窗口程序返回的值。尽管返回值的含义依赖于被调度的消息,但返回值通常被忽略。

  备注:MSG结构必须包含有效的消息值。如果参数lpmsg指向一个WM_TIMER消息,并且WM_TIMER消息的参数IParam不为NULL,则调用IParam指向的函数,而不是调用窗口程序。

  速查:Windows NT:3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib;Unicode:在Windows NT环境下以Unicode和ANSI方式实现。

总结:TranslateMessage函数将键盘消息转化,DispatchMessage函数将消息传给窗体函数去处理.

联系:

在Windows的内部,GetMessage和PeekMessage执行着相同的代码,Peekmessage和Getmessage都是向系统的消息队列中取得消息,并将其放置在指定的结构。
区别:
PeekMessage:有消息时返回TRUE,没有消息返回FALSE   
GetMessage:有消息时且消息不为WM_QUIT时返回TRUE,如果有消息且为WM_QUIT则返回FALSE,没有消息时不返回。

GetMessage:取得消息后,删除除WM_PAINT消息以外的消息。
PeekMessage:取得消息后,根据wRemoveMsg参数判断是否删除消息。PM_REMOVE则删除,PM_NOREMOVE不删除。
The PeekMessage function normally does not remove WM_PAINT messages from the queue. WM_PAINT messages remain in the queue until they are processed. However, if a WM_PAINT message has a null update region, PeekMessage does remove it from the queue.
不能用PeekMessage从消息队列中删除WM_PAINT消息,从队列中删除WM_PAINT消息可以令窗口显示区域的失效区域变得有效(刷新窗口),如果队列中包含WM_PAINT消息程序就会一直while循环了。
用法:
原型:BOOL GetMessage(
LPMSG lpMsg,         // address of structure with message
HWND hWnd,           // handle of window
UINT wMsgFilterMin,  // first message
UINT wMsgFilterMax   // last message
);

while (GetMessage(&msg, NULL, 0, 0))       
{       
TranslateMessage (&msg);       
DispatchMessage (&msg);       
}      
return msg.wParam;

原型:
BOOL PeekMessage(
LPMSG lpMsg,         // pointer to structure for message
HWND hWnd,           // handle to window
UINT wMsgFilterMin,  // first message
UINT wMsgFilterMax,  // last message
UINT wRemoveMsg      // removal flags
);

while (TRUE)
{        
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))        
{        
if (msg.message == WM_QUIT)        
break;        
TranslateMessage (&msg);        
DispatchMessage (&msg);        
}        
else        
{        
// 处理空闲任务        
}       
}       
return msg.wParam;

TranslateMessage(转换消息):
用来把虚拟键消息转换为字符消息。由于Windows对所有键盘编码都是采用虚拟键的定义,这样当按键按下时,并不得字符消息,需要键盘映射转换为字符的消息。
TranslateMessage函数用于将虚拟键消息转换为字符消息。字符消息被投递到调用线程的消息队列中,当下一次调用GetMessage函数时被取出。当我们敲击键盘上的某个字符键时,系统将产生WM_KEYDOWN和WM_KEYUP消息。这两个消息的附加参数(wParam和lParam)包含的是虚拟键代码和扫描码等信息,而我们在程序中往往需要得到某个字符的ASCII码,TranslateMessage这个函数就可以将WM_KEYDOWN和WM_ KEYUP消息的组合转换为一条WM_CHAR消息(该消息的wParam附加参数包含了字符的ASCII码),并将转换后的新消息投递到调用线程的消息队列中。注意,TranslateMessage函数并不会修改原有的消息,它只是产生新的消息并投递到消息队列中。
也就是说TranslateMessage会发现消息里是否有字符键的消息,如果有字符键的消息,就会产生WM_CHAR消息,如果没有就会产生什么消息。

DispatchMessage(分派消息):
把 TranslateMessage转换的消息发送到窗口的消息处理函数,此函数在窗口注册时已经指定。

转载于:https://www.cnblogs.com/xingrun/p/3583357.html

消息循环中的TranslateMessage函数和DispatchMessage函数,特别注意WM_TIMER消息相关推荐

  1. 消息循环中的TranslateMessage函数和DispatchMessage函数

    TranslateMessage函数 函数功能描述:将虚拟键消息转换为字符消息.字符消息被送到调用线程的消息队列中,在下一次线程调用函数GetMessage或PeekMessage时被读出. . 函数 ...

  2. 消息循环中TranslateMessage和Dispatch函数的作用

    TranslateMessage函数 函数功能描述:将虚拟键消息转换为字符消息.字符消息被送到调用线程的消息队列中,在下一次线程调用函数GetMessage或PeekMessage时被读出. .函数原 ...

  3. duilib中TranslateMessage函数和DispatchMessage函数

    TranslateMessage函数 函数功能描述:将虚拟键消息转换为字符消息.字符消息被送到调用线程的消息队列中,在下一次线程调用函数GetMessage或PeekMessage时被读出. .函数原 ...

  4. 十五: TranslateMessage(msg) 函数 和DispatchMessage(msg)函数

    TranslateMessage函数将虚拟键消息转换为字符消息.字符消息被寄送到调用线程的消息队列里,当下一次线程调用函数GetMessage或PeekMessage时被读出. TranslateMe ...

  5. R语言循环中break函数和next函数使用实战

    R语言循环中break函数和next函数使用实战 目录 R语言循环中break函数和next函数使用实战 #基础for循环 #带break的for循环

  6. html页面如何循环遍历,遍历foreach循环中的HTML DOM元素

    5 个答案: 答案 0 :(得分:3) 您可以使用closest('tr')查找最近的父tr元素,然后使用index()获取行号.试试这个: $('td').click(function() { va ...

  7. java sleep 循环_while循环中的Thread.sleep()

    我注意到NetBeans警告我在我的Java代码中使用while循环中的Thread.sleep(),所以我已经对这个主题进行了一些研究 . 主要问题似乎是性能问题,当计数器仍处于休眠状态时,你的状态 ...

  8. el-upload在表单循环中,实现选择,删除,拖拽,并且和表单数组对上

    el-upload在表单循环中,实现选择,删除,拖拽,并且和表单数组对上: 微信: volley369 业务要求,实现以下效果: 业务要求: el-upload肯定不能一个个的写,要用json去循环 ...

  9. for循环中var和let的区别

    今天在做题的时候,遇到了一个不太懂的问题,经过查阅资料,终于搞明白了这个问题,发出来当做个笔记. 首先是var: for (var i = 0; i < 5; i++) { setTimeout ...

最新文章

  1. CSLA.Net 3.0.5 项目管理示例 名值列表基类、只读基类、业务负责人基类
  2. iOS集成alipay无线应用sdk错误问题
  3. [转]Tomcat启动错误的几件事
  4. 【火炉炼AI】机器学习013-用朴素贝叶斯分类器估算个人收入阶层
  5. [vue] vue自定义事件中父组件怎么接收子组件的多个参数?
  6. 台式机电脑配置单_2020年电脑配置单重点硬件参考
  7. 《Asp.Net 2.0 揭秘》读书笔记(九)
  8. 华为Mate 30系列或下血本采用双主摄方案:CMOS尺寸破纪录
  9. oracle11g 时间失效,关于oracle11g RAC 的CTSS与ntp时间同步的疑问
  10. 视频语音自动生成字幕文件的免费软件工具,日剧,美剧都能看懂了
  11. sqlmap使用 mysql_求sqlmap使用教程?
  12. 打开和关闭 Oralce PDB数据库
  13. ps cc 生成html,Photoshop自定义工具扩展面板(支持PS CC 2019)
  14. redis 结合 spring
  15. JS简单总结(前端ES6和JQ)
  16. Hibernate用Query删除数据表中的数据的问题(EntityManager.clear())
  17. PPT制作毛玻璃效果
  18. 【C语言趣味编程100题】
  19. 【C库函数】 strstr函数详解
  20. 股票实时数据接口软件的数据来源是哪里?

热门文章

  1. 放疗是用计算机勾画靶区吗,常见肿瘤放疗靶区勾画(12)——胰腺癌
  2. C++题解:吃蛋糕 (新)
  3. 【笔记本装内存】谢谢师兄帮我装内存条!!
  4. 让大数据分析更有效的5种技术措施
  5. 在线随机美图API接口服务
  6. 【转】Python 量化投资实战教程(1) — Backtrader 教程
  7. 初学python量化投资(一)
  8. 不要作温水里的那只青蛙
  9. oracle VM VirtualBox 安装 Zabbix Appliance
  10. 大数据在物流领域有哪些应用呢?