MiniGUI消息发送与处理
2013-03-23 10:28
190 查看
1.将消息投递到一个先进先出队列中
2.直接把消息发给窗口过程
投递到队列中的消息主要有:
键盘和鼠标消息MSG_LBUTTONDOWN,MSG_MOUSEMOVE,MSG_KEYDOWN,MSG_CHAR
定时器消息MSG_TIMER
绘制消息MSG_PAINT
退出消息MSG_QUIT
可以用HavePendingMessage函数检查消息队列中是否有消息而不取出的消息
BOOL GUIAPI HavePendingMessage(HWND hMainWnd);
直接发送到窗口过程的消息一般用于通知窗口完成一些需要立即处理的事件,如MSG_ERASEBKGND消息
消息的处理
一般通过一个消息循环来处理消息队列中的消息
GetMessage从消息队列中取出消息
TranslateMessage翻译消息
DispatchMessage发送消息
在Thread中当要求等待消息立即返回以处理其他事务时可以使用HavePendingMessage
窗口过程是一个特定类型的函数,用于接收和处理所有发送到该窗口的消息
每个控件类也有一个窗口过程,属于同一控件类的所有控件共用同一个窗口过程处理消息
如果窗口过程不处理某些消息一般把该消息传给系统进行默认处理
int DefaultMainWinProc(HWND hwnd,int message,WPARAM wParam,LPARAM lParam);
对话框缺省消息处理函数
int DefaultDialogProc(HWND hwnd,int message,WPARAM wParam,LPARAM lParam);
控件窗口缺省消息处理函数
int DefaultControlProc(HWND hwnd,int message,WPARAM wParam,LPARAM lParam);
投递:把一条消息复制到消息队列中
发送: 直接把消息发送到窗口过程函数
消息处理函数:
PostMessage:将消息放到消息队列后立即返回,用于发送非关键性消息,受消息缓冲区限制
SendMessage:将消息发送到窗口过程,等待处理完后返回
SendNotifyMessage:同PostMessage,采用链表处理,不受缓冲区限制,一般用于从控件向父窗口发送“通知消息”
PostQuitMessage:将MSG_QUIT消息投递到消息队列中
将指定消息广播给桌面的所有主窗口:
int GUIAPI BroadcastMessage(int iMsg,WPARAM wParam,LPARAM lParam);
丢弃消息队列中所有消息并返回个数
int GUIAPI ThrowAwayMessages(HWND pMainWnd);
等待一有消息就返回
BOOL GUIAPI WaitMessage(PMSG pMsg,HWND hMainWnd);
2.直接把消息发给窗口过程
投递到队列中的消息主要有:
键盘和鼠标消息MSG_LBUTTONDOWN,MSG_MOUSEMOVE,MSG_KEYDOWN,MSG_CHAR
定时器消息MSG_TIMER
绘制消息MSG_PAINT
退出消息MSG_QUIT
可以用HavePendingMessage函数检查消息队列中是否有消息而不取出的消息
BOOL GUIAPI HavePendingMessage(HWND hMainWnd);
直接发送到窗口过程的消息一般用于通知窗口完成一些需要立即处理的事件,如MSG_ERASEBKGND消息
消息的处理
一般通过一个消息循环来处理消息队列中的消息
GetMessage从消息队列中取出消息
TranslateMessage翻译消息
DispatchMessage发送消息
MSG msg; HWND hMainWnd; MAINWINCREATE CreateInfo; InitCreateInfo(&CreateInfo); hMainWnd=CreateMainWindow(&CreateInfo); if(hMainWnd==HWND_INVALID) return -1; while(GetMessage(&msg,hMainWnd)) { TranslateMessage(&msg); DispatchMessage(&msg); }
在Thread中当要求等待消息立即返回以处理其他事务时可以使用HavePendingMessage
do { ReadMasterPty(pConInfo); if(pConInfo->terminate) break; while(HavePendingMessage(hMainWnd)) { if(!GetMessage(&msg,hMainWnd)) break; DispatchMessage(&msg); } }while(true);
窗口过程是一个特定类型的函数,用于接收和处理所有发送到该窗口的消息
每个控件类也有一个窗口过程,属于同一控件类的所有控件共用同一个窗口过程处理消息
如果窗口过程不处理某些消息一般把该消息传给系统进行默认处理
int DefaultMainWinProc(HWND hwnd,int message,WPARAM wParam,LPARAM lParam);
对话框缺省消息处理函数
int DefaultDialogProc(HWND hwnd,int message,WPARAM wParam,LPARAM lParam);
控件窗口缺省消息处理函数
int DefaultControlProc(HWND hwnd,int message,WPARAM wParam,LPARAM lParam);
投递:把一条消息复制到消息队列中
发送: 直接把消息发送到窗口过程函数
消息处理函数:
PostMessage:将消息放到消息队列后立即返回,用于发送非关键性消息,受消息缓冲区限制
SendMessage:将消息发送到窗口过程,等待处理完后返回
SendNotifyMessage:同PostMessage,采用链表处理,不受缓冲区限制,一般用于从控件向父窗口发送“通知消息”
PostQuitMessage:将MSG_QUIT消息投递到消息队列中
将指定消息广播给桌面的所有主窗口:
int GUIAPI BroadcastMessage(int iMsg,WPARAM wParam,LPARAM lParam);
丢弃消息队列中所有消息并返回个数
int GUIAPI ThrowAwayMessages(HWND pMainWnd);
等待一有消息就返回
BOOL GUIAPI WaitMessage(PMSG pMsg,HWND hMainWnd);
相关文章推荐
- 用消息发送队列提高网络应用处理效率
- 微信开发处理超时5s(java),异步发送客服消息
- 消息处理(二):投递与发送
- Disruptor多个消费者不重复处理生产者发送的消息的demo
- PHP处理微信中带Emoji表情的消息发送和接收(Unicode字符转码编码)
- unity 消息发送处理机制
- 注意:消息都是由控件发送给父窗口处理的
- 微信公共号开发教程java版——发送消息和处理消息(四)
- java.lang.RuntimeException: 将消息发送到死的线程上处理程序的处理程序 (android.os.Handler)
- handle.sendEmptyMessageDelayed(message ,TIME_OUT) 发送延迟处理的消息
- QT中用udp客户端发送消息,丢失数据的情况以及处理!
- 给线程发送消息让它执行不同的处理
- 给线程发送消息让它执行不同的处理(自己建立消息循环,非常有意思) good
- kafka无法发送消息问题处理
- UChome 发送及进入消息 出错 处理方法
- PHP处理微信中带Emoji表情的消息发送和接收(Unicode字符转码编码)
- ListCtrl列表控件中NM_CLICK消息的发送和处理一例
- handler looper 消息发送和消息处理流程
- Handler发送消息后消息队列的处理
- 一定搞懂Handler消息处理机制系列之「01.Handler消息发送」