消息的知识:
一、消息循环的阻塞
GetMessage-从系统获取消息,将消息从系统中移除,阻塞函数。当系统无消息时,会等候下一条消息。
多一句嘴,TranslateMessage消息只翻译键盘消息
PeekMessage-以查看的方式从系统获取消息,可以不将消息从系统移除,非阻塞函数。当系统无消息时,返回FALSE,继续执行后续代码。

//PeekMessage定义
BOOL PeekMessage(LPMSG lpMsg, //message infomationHWND hWnd, //handle to windowUINT wMsgFilterMin, //firstMessageUINT wMsgFilterMax, //lastMessgaeUINT wRemoveMsg //移除标识 PM_REMOVE/PM_NOREMOVE);

PeekMessage用法示例:(最后的WriteConsole函数真的是闲的蛋疼)

while(1){if(PeekMessage(&msg,hwnd,0,0,PM_NOREMOVE)){//消息队列中有消息if(GetMessage(&msg,hwnd,0,0)){//有消息时处理消息TranslateMessage(&msg);DispatchMessage(&msg);}else{//如果获得消息是0,退出消息循环return 0;}}else{//消息队列中没有消息,可以利用这时候的资源进行别的操作处理WriteConsole(hOutPut,TEXT("空闲\n"),lstrlen(TEXT("空闲\n")),NULL,NULL);}}

二、发送消息
SendMessage-发送消息,会等候消息处理的结果。
PostMessage-投递消息,消息发出后立即返回,不等候消息处理。
SendMessage/Postmesage函数定义

BOOL SendMessage/PostMessage(HWND hWnd, //消息发送的目的窗口UINT Msg, //消息IDWPARAM wParam, //消息参数LPARAM lParam //消息参数);

PostQuitMessage也是投递消息,只不过投递的是退出消息
自主发送退出消息WM_QUIT消息给窗口

case WM_DESTROY://PostQuitMessage(0);PostMessage(hwnd,WM_QUIT,0,0);//SendMessage(hwnd,WM_QUIT,0,0);break;

系统消息-ID范围0~0x03FF(1024个消息)
由系统定义好的消息,可以在程序中直接使用
用户自定义消息-ID范围0x0400-0x7FFF(31743)
由用户自定义,满足用户自己的需求。由用户自已发送消息,并响应处理。
自定义消息宏:WM_USER 0x400

//1.定义自定义消息
#define WM_ZCMMSG WM_USER+0x01
//2.发送自定义消息
PostMessage(hwnd,WM_ZCMMSG,100,200);
SendMessage(hwnd,WM_ZCMMSG,200,300);
//3.处理消息(在消息处理函数中)
void OnZcmMessage(HWND hwnd,WPARAM wParam,LPARAM lParam)
{TCHAR szText[256] = {0};wsprintf(szText,TEXT("自定义消息:wParam=%d,lParam=%d"),wParam,lParam);MessageBox(hwnd,szText,TEXT("消息提示:"),MB_OK);
}
//消息处理函数中处理消息
case WM_ZCMMSG:OnZcmMessage(hwnd,wParam,lParam);break;

完整的程序代码如下:

#include <windows.h>
#pragma comment(lib, "winmm.lib")
#define WM_ZCMMSG WM_USER+0x01HANDLE hOutPut;void OnZcmMessage(HWND hwnd,WPARAM wParam,LPARAM lParam)
{TCHAR szText[256] = {0};wsprintf(szText,TEXT("自定义消息:wParam=%d,lParam=%d"),wParam,lParam);MessageBox(hwnd,szText,TEXT("消息提示:"),MB_OK);
}void OnSizeChange(HWND hwnd,LPARAM lParam)
{int nWidth = LOWORD(lParam);int nHight = HIWORD(lParam);TCHAR szbuf[1024];wsprintf(szbuf,TEXT("坐标:X = %d Y = %d \n"),nWidth,nHight);WriteConsole(hOutPut,szbuf,lstrlen(szbuf),NULL,NULL);
}void OnCreate(HWND hwnd,LPARAM lParam)
{CREATESTRUCT* cst = (CREATESTRUCT*)lParam;TCHAR* szmsg = (TCHAR*)cst->lpCreateParams;MessageBox(NULL,szmsg,TEXT("命令行参数:"),MB_OK);CreateWindowEx(0,"EDIT",TEXT("请输入:"),WS_CHILD|WS_VISIBLE|WS_BORDER,0,0,500,25,hwnd,NULL,NULL,NULL);
}LRESULT CALLBACK zcmproc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPreInstance,LPSTR lpCmdLine,int nCmdShow)
{static TCHAR szAppName[] = TEXT("windows_zcm");static TCHAR szInfo[1024];wsprintf(szInfo,TEXT("%s"),lpCmdLine);HWND hwnd;MSG msg;WNDCLASS wnd;wnd.style = CS_HREDRAW | CS_VREDRAW;wnd.cbClsExtra = 0;wnd.cbWndExtra = 0;wnd.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);wnd.hCursor =LoadCursor(NULL,IDC_ARROW); wnd.hIcon = LoadIcon(NULL,IDI_APPLICATION); //IDI_APPLICATIONwnd.hInstance = hInstance;wnd.lpfnWndProc = zcmproc;wnd.lpszClassName = szAppName;wnd.lpszMenuName = NULL;AllocConsole(); //增加dos窗口hOutPut = GetStdHandle(STD_OUTPUT_HANDLE);if(!RegisterClass(&wnd)){MessageBox(NULL,TEXT("注册windows窗口失败"),szAppName,MB_ICONERROR);return 0;}hwnd = CreateWindowEx(0,szAppName,TEXT("Windows API 程序示例"),WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL,hInstance,szInfo);ShowWindow(hwnd,nCmdShow);UpdateWindow(hwnd);PostMessage(hwnd,WM_ZCMMSG,100,200);/*    while(GetMessage(&msg,hwnd,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}
*/while(1){if(PeekMessage(&msg,hwnd,0,0,PM_NOREMOVE)){//消息队列中有消息if(GetMessage(&msg,hwnd,0,0)){//有消息时处理消息TranslateMessage(&msg);DispatchMessage(&msg);}else{//如果获得消息是0,退出消息循环return 0;}}else{//消息队列中没有消息,可以利用这时候的资源进行别的操作处理WriteConsole(hOutPut,TEXT("空闲\n"),lstrlen(TEXT("空闲\n")),NULL,NULL);}}FreeConsole();return msg.wParam;
}LRESULT CALLBACK zcmproc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
{HDC hdc;PAINTSTRUCT ps;RECT rect;static TCHAR szMusicTitle[] = TEXT("win98.wav");TCHAR szstr[1024];switch(msg){case WM_ZCMMSG:OnZcmMessage(hwnd,wParam,lParam);break;case WM_SYSCOMMAND:if(wParam == SC_CLOSE){if(IDNO == MessageBox(hwnd,TEXT("是否退出?\n提示:如果按“是”则直接退出,按“否”点提示鼠标点击位置!"),TEXT("提示:"),MB_YESNO)){wsprintf(szstr,"鼠标点击位置为:X=%d,Y=%d\n点击“确定”退出程序!",LOWORD(lParam),HIWORD(lParam));MessageBox(hwnd,szstr,TEXT("按鼠标的位置:"),MB_OK);}else{PostMessage(hwnd,WM_QUIT,0,0);}}else if(SC_MINIMIZE == wParam){MessageBox(hwnd,TEXT("点击了最小化按钮!"),TEXT("提示:"),MB_OK);}else if(SC_MAXIMIZE == wParam){MessageBox(hwnd,TEXT("点击了最大化按钮!"),TEXT("提示:"),MB_OK);}break;case WM_CREATE:PlaySound(szMusicTitle,NULL,SND_FILENAME|SND_ASYNC);OnCreate(hwnd,lParam);break;case WM_PAINT:hdc = BeginPaint(hwnd,&ps);GetClientRect(hwnd,&rect);//DrawText(hdc,TEXT("第一个实验程序!"),-1,&rect,DT_SINGLELINE|DT_CENTER|DT_VCENTER);EndPaint(hwnd,&ps);break;case WM_SIZE:OnSizeChange(hwnd,lParam);break;case WM_DESTROY://PostQuitMessage(0);PostMessage(hwnd,WM_QUIT,0,0);SendMessage(hwnd,WM_QUIT,0,0);break;}return DefWindowProc(hwnd,msg,wParam,lParam);
}

windows消息分类PostMessage、SendMessage相关推荐

  1. 详解Windows消息分类以及WM_COMMAND与WM_NOTIFY的区别,以及模拟发送控件通知消息

    Windows消息的分类 1. 标准消息(队列消息)   除WM_COMMAND之外,所有以WM_开头的消息都是标准消息,如WM_MOUSEMOVE.WM_LBUTTONUP.WM_KEYDOWN.W ...

  2. 【转】详解Windows消息分类以及WM_COMMAND与WM_NOTIFY的区别,以及模拟发送控件通知消息

    转自:http://blog.sina.com.cn/s/blog_4b3c1f950100nten.html Windows消息的分类 1. 标准消息(队列消息)   除WM_COMMAND之外,所 ...

  3. SendMessage和PostMessage及Windows消息机制简介

    SendMessage: The SendMessage function sends the specified message to a window or windows. It calls t ...

  4. Windows 消息循环(1) - 概览

    本文从消息循环是如何驱动程序的这个角度,对 Windows 消息循环进行概览性介绍. 使用 EN5 课件获得更好的阅读体验: [希沃白板5]课件分享 : <Windows培训 - 消息循环> ...

  5. Windows消息机制(MFC)

    消息分类与消息队列 Windows中,消息使用统一的结构体(MSG)来存放信息,其中message表明消息的具体的类型, 而wParam,lParam是其最灵活的两个变量,为不同的消息类型时,存放数据 ...

  6. windows消息机制-4(MFC)

    消息分类与消息队列 Windows中,消息使用统一的结构体(MSG)来存放信息,其中message表明消息的具体的类型, 而wParam,lParam是其最灵活的两个变量,为不同的消息类型时,存放数据 ...

  7. windows消息机制详解-3

    1. 引言 Windows 在操作系统平台占有绝对统治地位,基于Windows 的编程和开发越来越广泛. Dos 是过程驱动的,而Windows 是事件驱动的[6],这种差别的存在使得很多Dos 程序 ...

  8. 【转】深入理解Windows消息机制

    转自:https://blog.csdn.net/liulianglin/article/details/14449577 今天我们来学一学Windows消息机制,我们知道在传统的C语音程序中,当我们 ...

  9. Windows消息概述

    在 C++程序架构  一文中,我们看到,程序是由一些层次和模块组成的,那么,这些模块之间, 以及你的程序和windows 之间,是如何传递信息呢?在windows 的平台上,传递信息是由 window ...

最新文章

  1. Java反射机制demo(四)—获取一个类的父类和实现的接口
  2. Confusion matrix
  3. 移动端1px线的实现
  4. Android的px、dp和sp
  5. Linux系统文件I/O编程(一)---open()等基本函数
  6. SAP云采购解决方案入华在即
  7. mysql在线修改表结构大数据表的风险与解决办法归纳
  8. 比较两个时间字符串的大小
  9. 【机器视觉】 Halcon代码导出高级语言代码
  10. java mongodb dbref_Spring DATA MongoDB @DBref查询,or和and联合查询
  11. Runtime的应用
  12. 【Hihocoder - offer编程练习赛39 - D】前缀后缀查询(后缀字典树,哈希,思维)
  13. php set_timeout,和 JS 一样的 php setTimeout 函数
  14. 穿越迷宫c语言程序设计教程课后答案,实验二 迷宫实验.doc
  15. 附加数据库后登陆报错
  16. idea怎么和mysql连接并执行_IDEA配置mysql数据库的操作
  17. angular4与高德地图的结合
  18. Unity3d C# Socket 下载文件 (同步到)
  19. Linux 通配符 与 正则表达式 的区别与详解
  20. 使用Graphics2D给报警图片画框和提示信息

热门文章

  1. 我的Blog——python封装为exe的注意事项(封装exe看这一篇基本就够了)
  2. JAVA练习10-累加数
  3. SRM采购框架协议阶梯计价方法
  4. NS3学习记录(四)--加入新模型及聚合Aggregate
  5. python使用opencv通过掩码提取彩色图片感兴趣区域
  6. 跨境电商收款之派安盈Payoneer个人账号收款教程
  7. sublime text 64位 3.3114 绿色汉化版下载地址
  8. (转载)适合大学生旅游时住的各地旅馆
  9. 大数据开发技术课程报告(搭建Hadoop完全分布式集群操作集群)
  10. 【SAP ABAP学习资料】(财务相关)BTE增强查找,新增