使用消息和消息队列(译自MSDN)

来源:互联网 发布:group by mysql 编辑:程序博客网 时间:2024/05/17 22:17
创建消息循环
1,系统自动为每个线程创建消息队列。如果这个线程创建了一个或多个窗口,则需要提供一个消息循环;这个消息循环从线程的消息队列里检索消息,然后发送给相关的窗口过程函数。
2,由于系统把消息发到每个程序的窗口,线程在开始消息循环之前必须创建至少一个窗口。大多数程序只包含一个创建了窗口的线程。典型情况是程序为主窗口注册窗口类、创建并显示主窗口、启动消息循环的工作都在一个WinMain函数中完成。
3,GetMessage和DispathMessage函数可用来创建一个消息循环。如果必须获得用户的字符输入,循环里需要包含TranslateMessage。TranslateMessage把虚拟键消息转换为字符消息。


检索消息队列
1,有时候需要在线程的消息循环之外来获取消息队列内容。比如一个程序窗口过程在处理一个漫长的绘制操作,你可能希望能打断这个操作。可是除非你在鼠标键盘消息期间周期性地去检索消息队列,否则在操作完成之前不会响应用户输入。原因是消息循环里的DispatchMessage函数在窗口过程处理完成之前不会返回。
2,在执行长时间操作时,你可以用PeekMessage 来检索消息队列。和GetMessage类似,都是从消息队列检出一个满足条件的消息,然后把消息复制到一个MSG结构。主要的区别是GetMessage不返回直到一个满足条件的消息入队,而PeekMessage直接返回。
3,还有些函数能检索消息队列的内容。GetQueueStatus返回消息队列里消息类型的一个数组,用它可以很快判断队列里是否包含消息。GetInputState当队列包含鼠标键盘消息时返回真。这两个函数都可以用来判断是否队列包含需要处理的消息。


Post一个消息
1,PostMessage把消息放到线程的消息队列末尾,就直接返回了,不管线程是否处理了该消息。参数有一个窗口句柄、一个消息ID、2个消息参数。系统把这些拷到一个MSG结构体,再填充里面的time和pt成员,然后把这个结构体加入消息队列。
2,系统根据PostMessage传递的窗口句柄参数,决定哪个线程消息队列接收该消息。如果句柄是HWND_TOPMOST,系统发到所有顶层窗口的消息队列。
3,可用PostThreadMessage函数把消息发到特定的线程消息队列。
4,可用PostQuitMessage 退出消息循环。PostQuitMessage 发送WM_QUIT 消息到当前执行线程。当一个线程收到WM_QUIT消息就结束消息循环,并返回控制给系统。应用程序经常在WM_DESTROY的响应中调用PostQuitMessage 。


Send一个消息
1,SendMessage函数用来直接把消息发送到一个窗口过程函数。它调用一个窗口过程函数然后等待函数处理完这个消息后再返回。
0 0
原创粉丝点击