windows消息分类PostMessage、SendMessage
消息的知识:
一、消息循环的阻塞
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相关推荐
- 详解Windows消息分类以及WM_COMMAND与WM_NOTIFY的区别,以及模拟发送控件通知消息
Windows消息的分类 1. 标准消息(队列消息) 除WM_COMMAND之外,所有以WM_开头的消息都是标准消息,如WM_MOUSEMOVE.WM_LBUTTONUP.WM_KEYDOWN.W ...
- 【转】详解Windows消息分类以及WM_COMMAND与WM_NOTIFY的区别,以及模拟发送控件通知消息
转自:http://blog.sina.com.cn/s/blog_4b3c1f950100nten.html Windows消息的分类 1. 标准消息(队列消息) 除WM_COMMAND之外,所 ...
- SendMessage和PostMessage及Windows消息机制简介
SendMessage: The SendMessage function sends the specified message to a window or windows. It calls t ...
- Windows 消息循环(1) - 概览
本文从消息循环是如何驱动程序的这个角度,对 Windows 消息循环进行概览性介绍. 使用 EN5 课件获得更好的阅读体验: [希沃白板5]课件分享 : <Windows培训 - 消息循环> ...
- Windows消息机制(MFC)
消息分类与消息队列 Windows中,消息使用统一的结构体(MSG)来存放信息,其中message表明消息的具体的类型, 而wParam,lParam是其最灵活的两个变量,为不同的消息类型时,存放数据 ...
- windows消息机制-4(MFC)
消息分类与消息队列 Windows中,消息使用统一的结构体(MSG)来存放信息,其中message表明消息的具体的类型, 而wParam,lParam是其最灵活的两个变量,为不同的消息类型时,存放数据 ...
- windows消息机制详解-3
1. 引言 Windows 在操作系统平台占有绝对统治地位,基于Windows 的编程和开发越来越广泛. Dos 是过程驱动的,而Windows 是事件驱动的[6],这种差别的存在使得很多Dos 程序 ...
- 【转】深入理解Windows消息机制
转自:https://blog.csdn.net/liulianglin/article/details/14449577 今天我们来学一学Windows消息机制,我们知道在传统的C语音程序中,当我们 ...
- Windows消息概述
在 C++程序架构 一文中,我们看到,程序是由一些层次和模块组成的,那么,这些模块之间, 以及你的程序和windows 之间,是如何传递信息呢?在windows 的平台上,传递信息是由 window ...
最新文章
- Java反射机制demo(四)—获取一个类的父类和实现的接口
- Confusion matrix
- 移动端1px线的实现
- Android的px、dp和sp
- Linux系统文件I/O编程(一)---open()等基本函数
- SAP云采购解决方案入华在即
- mysql在线修改表结构大数据表的风险与解决办法归纳
- 比较两个时间字符串的大小
- 【机器视觉】 Halcon代码导出高级语言代码
- java mongodb dbref_Spring DATA MongoDB @DBref查询,or和and联合查询
- Runtime的应用
- 【Hihocoder - offer编程练习赛39 - D】前缀后缀查询(后缀字典树,哈希,思维)
- php set_timeout,和 JS 一样的 php setTimeout 函数
- 穿越迷宫c语言程序设计教程课后答案,实验二 迷宫实验.doc
- 附加数据库后登陆报错
- idea怎么和mysql连接并执行_IDEA配置mysql数据库的操作
- angular4与高德地图的结合
- Unity3d C# Socket 下载文件 (同步到)
- Linux 通配符 与 正则表达式 的区别与详解
- 使用Graphics2D给报警图片画框和提示信息