浅析SendMessage与PostMessage的区别
2015-10-11 20:38
399 查看
SendMessage与PostMessage的区别应该是面试中经常问到的问题,我们可能只会简单用两句话来描述二者的区别。今天就二者的区别做一个深入的分析。
按照国际惯例,msdn上这样描述SendMessage:
翻译大致这个意思:将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口过程,直到窗口过程处理完消息后才返回。
函数原型如下:
msdn上PostMessage的如下描述:
翻译大致这个意思:ostMessage是把消息放到消息队列里就返回继续执行下一句。
函数原型如下:
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()函数,接收方在数据复制完成前不返回,这样发送方就不可能删除和修改数据。
按照国际惯例,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+100 const int MAX_INFO_SIZE = 20; HANDLE hStartEvent; // thread start event // thread function unsigned __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; }
相关文章推荐
- Mac系统终端命令行不执行命令 总出现command not found解决方法
- 例10-9 uva1636简单概率问题
- 浅析SendMessage与PostMessage的区别
- 例10-9 uva1636简单概率问题
- Linux使用dd命令备份大文件显示进度
- C++ 简单 Hash容器的实现
- poco c++和Boost库的对比分析
- 程序员面试之循环与递归(四)
- java产生缩略图
- ocp-302
- 一起talk C栗子吧(第五十六回:C语言实例--图的最短路径四)
- 背包问题1:01背包
- App快速上架经验
- 设计模式--里氏替换原则
- 信息安全系统设计基础第5周学习总结
- 音视频播放
- some commands for shutdown
- iframe有那些缺点
- 2015.10.10作业
- 全排列hash-康拓展开