浅析SendMessage与PostMessage的区别
来源:互联网 发布:华为云计算部门效益 编辑:程序博客网 时间:2024/06/15 15:54
SendMessage与PostMessage的区别应该是面试中经常问到的问题,我们可能只会简单用两句话来描述二者的区别。今天就二者的区别做一个深入的分析。
按照国际惯例,msdn上这样描述SendMessage:
Sends the specified message to a window or windows. The SendMessage function calls the window procedure for the specified window and does not return until the window procedure has processed the message.
翻译大致这个意思:将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口过程,直到窗口过程处理完消息后才返回。
函数原型如下:
LRESULT WINAPI SendMessage( _In_ HWND hWnd, _In_ UINT Msg, _In_ WPARAM wParam, _In_ LPARAM lParam);
msdn上PostMessage的如下描述:
Places (posts) a message in the message queue associated with the thread that created the specified window and returns without waiting for the thread to process the message.
翻译大致这个意思:ostMessage是把消息放到消息队列里就返回继续执行下一句。
函数原型如下:
BOOL WINAPI PostMessage( _In_opt_ HWND hWnd, _In_ UINT Msg, _In_ WPARAM wParam, _In_ LPARAM lParam);
1)使用SendMessage来实现剪切、复制和粘贴
SendMessage(hwnd, WM_COPY, 0, 0);
SendMessage(hwnd, WM_CUT, 0, 0);
SendMessage(hwnd, WM_PASTE, 0, 0);
2)SendMessage与PostMessage的区别
PostMessage将消息放入消息队列后马上返回,而SendMessage直到窗口过程处理完消息后才返回
3)SendMessage发送WM_COPYDATA消息在进程间传送数据
WM_COPYDATA消息主要目的是允许在进程间传递少量只读数据。SDK文档推荐用户使用SendMessage()函数,接收方在数据复制完成前不返回,这样发送方就不可能删除和修改数据。
#include <windows.h>#include <cstdio>#include <process.h>#define MY_MSG WM_USER+100const int MAX_INFO_SIZE = 20;HANDLE hStartEvent; // thread start event// thread functionunsigned __stdcall fun(void *param){ printf("thread fun start\n"); MSG msg; PeekMessage(&msg, NULL, WM_USER, WM_USER, PM_NOREMOVE); if(!SetEvent(hStartEvent)) //set thread start event { printf("set start event failed,errno:%d\n",::GetLastError()); return 1; } while(true) { if(GetMessage(&msg,0,0,0)) //get msg from message queue { switch(msg.message) { case MY_MSG: char * pInfo = (char *)msg.wParam; printf("recv %s\n",pInfo); delete[] pInfo; break; } } }; return 0;}int main(){ HANDLE hThread; unsigned nThreadID; hStartEvent = ::CreateEvent(0,FALSE,FALSE,0); //create thread start event if(hStartEvent == 0) { printf("create start event failed,errno:%d\n",::GetLastError()); return 1; } //start thread hThread = (HANDLE)_beginthreadex( NULL, 0, &fun, NULL, 0, &nThreadID ); if(hThread == 0) { printf("start thread failed,errno:%d\n",::GetLastError()); CloseHandle(hStartEvent); return 1; } //wait thread start event to avoid PostThreadMessage return errno:1444 ::WaitForSingleObject(hStartEvent,INFINITE); CloseHandle(hStartEvent); int count = 0; while(true) { char* pInfo = new char[MAX_INFO_SIZE]; //create dynamic msg sprintf(pInfo,"msg_%d",++count); if(!PostThreadMessage(nThreadID,MY_MSG,(WPARAM)pInfo,0))//post thread msg { printf("post message failed,errno:%d\n",::GetLastError()); delete[] pInfo; } ::Sleep(1000); } CloseHandle(hThread); return 0;}
0 0
- 浅析SendMessage与PostMessage的区别
- SendMessage与PostMessage的区别?
- postmessage 与sendmessage的区别
- PostMessage与SendMessage的区别
- sendmessage与postmessage的区别
- SendMessage与PostMessage的区别
- postmessage与sendmessage的区别
- PostMessage与SendMessage的区别
- SendMessage与PostMessage的区别
- SendMessage与PostMessage的区别
- SendMessage与PostMessage的区别
- PostMessage与SendMessage的区别
- PostMessage与SendMessage的区别
- SendMessage与PostMessage的区别
- SendMessage与PostMessage的区别
- SendMessage与PostMessage的区别
- SendMessage与PostMessage的区别
- SendMessage与PostMessage的区别
- 手写代码的一些经验
- 背包问题1:01背包
- ocp-302
- java产生缩略图
- 例10-9 uva1636简单概率问题
- 浅析SendMessage与PostMessage的区别
- Mac系统终端命令行不执行命令 总出现command not found解决方法
- 【贪心】 ZOJ 3908 Number Game
- ocp-303
- poj2398Toy Storage(叉积+二分)
- ocp-304
- ocp-305
- 例10-10 uva10491(简单概率)
- Multiplication Puzzle(区间DP:类似矩阵连乘问题的DP模板)