GetMessage () and PeekMessage ()
GetMessage 其唯一用途就是从事件对列中获得消息,并进行处理。当程序在等待通过 GetMessage 传递的消息时,主事件循坏基本上是锁定的。
那,如果我们要处理实时的事件循坏该怎么办呢?Windows 为我们提供了另一个函数 PeekMessage,他们的原型几乎是一样的,唯一的不同是 PeekMessage 比 GetMessage 多了一个参数:UINT wRemoveMsg // removal flags。
对于wRemoveMsg ,有效的标志有
PM_NOREMOVE,PeekMessage 处理之后,消息没有从序列中去除
PM_REMOVE,PeekMessage 处理之后,消息已经从序列中去除
怎样来实现实时事件循坏呢?
通过利用PeekMessage 来判断消息序列中是否有消息,如果有,就处理它;否则继续处理其他的游戏逻辑并重复进行。
他们的函数原型如下:
BOOL GetMessage (
LPMSG lpMsg, // pointer to structure for message
HWND hWnd, // handle to window
UINT wMsgFilterMin, // first message
UINT wMsgFilterMax ) // last message
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
SendMessage () and PostMessage ()
SendMessage 向窗口传递一个要求立即处理的消息。接收窗口处理完该消息后,该函数便紧接着 WinProc 返回。是同步的。
PostMessage 将消息发往窗口的消息序列,而后直接返回。如果不在意在消息被处理以前的时间延迟,或者该消息的优先级较低,就可以使用该函数。是异步的。
这两个函数的原型几乎一样,唯一的不同是返回值不同。SendMessage 返回 LRESULT,PostMessage 返回的是 BOOL。他们的函数原型如下:
LRESULT SendMessage ( HWND hWnd, UINT Msg, WPARAM wParam, r
LPARAM lParam);  非队列消息
BOOL PostMessage ( HWND hWnd, UINT Msg, WPARAM wParam, 
LPARAM lParam); 队列消息
typedef struct tagMSG { 
    HWND hwnd; //接收消息的窗口句柄  UINT message; //消息标识(ID)
    WPARAM wParam; LPARAM lParam; 
    DWORD time;// 消息产生的时间  POINT pt;// 消息产生时鼠标的位置
} MSG; 
键盘、鼠标消息以外,队列消息还有WM_PAINT、WM_TIMER和WM_QUIT。 
while (GetMessage(&msg, (HWND) NULL, 0, 0)) {//从消息队列得到消息 
       if (hwndDlgModeless == (HWND) NULL || !IsDialogMessage(hwndDlgModeless, &msg) && !TranslateAccelerator(hwndMain, haccel, &msg)) { //不是对话框消息和快捷键消息
     TranslateMessage(&msg); 
      DispatchMessage(&msg); //发送消息 
} }  
当得到消息WM_QUIT,或者::GetMessage出错时,退出消息循环。
系统消息ID的范围是从0到WM_USER-1,或0X80000到0XBFFFF;应用程序消息从WM_USER(0X0400)到0X7FFF,或 0XC000到0XFFFF;WM_USER到0X7FFF范围的消息由应用程序自己使用;0XC000到0XFFFF范围的消息用来和其他应用程序通信,为了ID的唯一性,使用::RegisterWindowMessage来得到该范围的消息ID。 

GetMessage PeekMessage SendMessage PostMessage相关推荐

  1. PostMessage,SendMessage,GetMessage,PeekMessage,TranslateMessage,DispatchMessage的用法集合

    SendMessage函数功能描述:将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口过程,直到窗口过程处理完消息后才返回. Postmessage函数则是将消息放入消息队列里,并立即返回. ...

  2. 深入GetMessage,PeekMessage以及Windows消息机制

    译者的话该文重点讲述了Windows处理事件.消息的具体过程和步骤.尤其是在系系处理鼠标键盘事件的过程上做了详解.通过这篇文章,你将对Windows的消息处理机制有一个较全面的了解. 概念这篇文章解释 ...

  3. keybd_event跟SendMessage,PostMessage模拟键盘消息的区别 z

    首先你会发现keybd_event函数中是没有窗口句柄作为参数的,好奇的你一定会觉得很奇怪,那是因为,keybd_event是全局模拟按键的,只对前台窗口(即当前的活动窗口)才可以,但是如果模拟的按键 ...

  4. Win32 API 发送消息 SendMessage/PostMessage

    1. Windows消息 Windows是一个基于事件的操作系统, 事件的本质是对消息的封装, 如鼠标移动点击, 键盘按键, 窗口移动尺寸变化等都会发送相应的消息. Windows操作系统中包括以下几 ...

  5. win32——消息循环 原理 函数 GetMessage PeekMessage TranslateMessage SendMessage PostMessage...

    //消息循环 MSG 结构体 typedef struct tagMSG {HWND hwnd;UINT message; //消息ID WPARAM wParam;LPARAM lParam;DWO ...

  6. WM_CLOSE、WM_DESTROY、WM_QUIT, SENDMESSAGE ,POSTMESSAGE

    1.发送消息SendMessage.PostMessage PostMessage将消息放入消息队列后马上返回,而SendMessage直到窗口过程处理完消息后才返回 2.三个消息的区别 WM_CLO ...

  7. 用SendMessage/PostMessage发送WM_SIZE消息

    一般情况下,调用MoveWindow()/SetWindowPos()函数会自动引发WM_SIZE消息,但有时候也需要手工发送该消息,使窗口调整大小和布局. SendMessage()和PostMes ...

  8. GetMessage PeekMessage

    最近在忙活进程通讯的东西,其中在A进程中有个通讯线程ATHREAD,B进程中有通讯线程Bthread,研究了半天这个THREAD该怎么写,研究结果如下. 1.线程中创建一个窗口.这个窗口的消息循环需要 ...

  9. C#用 SendKyes 结合 Process 或 API FindWindow、SendMessage(PostMessage) 等控制外部程序

    Win32 平台是 消息驱动模式 .Net 框架是 事件驱动模式 标题所指的 "控制外部程序",外部程序是指与本程序无内在相关性的另外一个程序 基于上面提到的,对于.NET的win ...

最新文章

  1. torch.nn.Embedding
  2. R语言dplyr包排序及序号函数实战(row_number、ntile、min_rank、dense_rank、percent_rank、cume_dist)
  3. python链表的创建_Python——新建链表
  4. plsql tables 没有表_天长视唱练耳辅导班收费表,安徽高考音乐培训学校,你知道吗...
  5. OpenGL小试牛刀第一季
  6. Python爬虫辅助库BeautifulSoup4用法精要
  7. 从零开始的FPGA学习(2)(用三八译码器实现一位全加器)
  8. 关于tcp/udp网络调试助手错误提示
  9. Matlab 边界提取
  10. 5, Swift tableView点击收起展开的效果
  11. 019-zabbix数据库表详解
  12. javaWeb之Response
  13. python_面向对象,以及类的相关知识
  14. 60种数据可视化图表总结
  15. 如何利用阿里云进行创建属于自己的网站
  16. 煤炭企业基于数据挖掘技术的云ERP应用分析
  17. 一个表字段做为表名_在冬天,安心做一个简单知足的人 |为你读诗
  18. 个股牛市的条件(1)
  19. Java 面试题:数据结构 + 算法 +JVM+ 线程 +finalize+GC
  20. 如何在VC中加减日期及 CTime COleDateTime的常用操作

热门文章

  1. 打车应用生死未卜 嘀嘀或傍上腾讯
  2. python agg函数,python pandas自定义agg函数
  3. 大连python培训费用-大连Python培训价格_Python培训哪家好
  4. Linux各个发行版本代号整理
  5. 2019晋城一中开放日
  6. Win7下安装Ubuntu11.10(解决linux try(hd0,0):NTFS5:no ang0引导问题)
  7. c印记(二):lw_oopc简介
  8. 心血来潮——gitlab-ce汉化版
  9. Spark Streaming架构介绍_大数据培训
  10. C++题目分享之小鱼比可爱