windows消息和消息队列实例详解Word文件下载.docx

上传人:b****5 文档编号:15786913 上传时间:2022-11-16 格式:DOCX 页数:7 大小:20.63KB
下载 相关 举报
windows消息和消息队列实例详解Word文件下载.docx_第1页
第1页 / 共7页
windows消息和消息队列实例详解Word文件下载.docx_第2页
第2页 / 共7页
windows消息和消息队列实例详解Word文件下载.docx_第3页
第3页 / 共7页
windows消息和消息队列实例详解Word文件下载.docx_第4页
第4页 / 共7页
windows消息和消息队列实例详解Word文件下载.docx_第5页
第5页 / 共7页
点击查看更多>>
下载资源
资源描述

windows消息和消息队列实例详解Word文件下载.docx

《windows消息和消息队列实例详解Word文件下载.docx》由会员分享,可在线阅读,更多相关《windows消息和消息队列实例详解Word文件下载.docx(7页珍藏版)》请在冰豆网上搜索。

windows消息和消息队列实例详解Word文件下载.docx

 

1. 

消息类型

2. 

消息传递

3. 

消息处理

4. 

消息过滤

5. 

postmessage和sendmessage

6. 

消息死锁

7. 

广播消息

8. 

查询消息

现分述如下:

1.Windows消息

windows通过消息的形式向窗口传递用户输入。

消息可以由系统和应用程序生成。

该系统会为每个输入事件产生相应的消息,

例如,用户点击鼠标,移动鼠标或滚动条,或是应用程序改变了系统的某些属性,比如说系统更改了字体资源,改变了某个窗口的

大小。

不仅如此,应用程序可以生成消息,通告发送消息指定它的窗体去执行某些任务或者是与其他的应用程序交互。

windows系统将消息发送到一个窗口消息处理函数时传递四个参数:

窗口句柄,消息标识符,两个DWORD值(消息参数)。

窗口句柄标识了该消息的目的窗口。

windows使用它来确定是哪个窗口的的窗口消息处理函数收到该消息。

一个消息标识符是一个有名字的常量,用来表明消息的意义。

当一个窗口处理函数收到一条消息,它根据判断消息标识符来决定如何处理该消息,例如,消息标识符WM_PAINT消息告诉窗口程序窗口的客户区已发生变化,必须重绘。

消息参数(DWORD值)指定传递的数据或是数据的地址。

消息参数可以是一个整型值,一个指针值。

也可以为NULL。

一个窗口过程必须根据消息标识符来确定如何解释消息参数。

2.windows消息类型

本节描述消息的两种类型:

(1)系统定义的消息

(2)应用程序定义的消息

系统定义的消息

操作系统向应用程序发送消息来和应用程序通讯。

操作系统通过消息控制应用程序的运行,向应用程序传递用户输入以及一些其他有用的信息。

应用程序也可以发送系统定义的消息,应用程序通过这些消息去控制使用注册窗口类创建的控件的窗口的运行。

每个系统定义的消息都有一个唯一的消息标识符和相应的符号常量(在windowsSDK的头文件里定义)。

符号常量通常会表明系统定义的消息所属的类别。

不同的前缀表明不同的类别。

一下是常见的分类:

Prefix 

Messagecategory

WM 

Generalwindow(一般的窗口)

ABM 

Applicationdesktoptoolbar(应用程序桌面工具条)

BM 

Buttoncontrol(按钮控件)

CB 

Comboboxcontrol(组合框控件)

CBEM 

Extendedcomboboxcontrol(扩展的组合框控件)

CDM 

Commondialogbox(普通的对话框)

DBT 

Device(设备)

DL 

Draglistbox(下拉列表)

DM 

Defaultpushbuttoncontrol(默认按钮控件)

DTM 

Dateandtimepickercontrol(日期和时间选择控件)

EM 

Editcontrol(编辑控件)

HDM 

Headercontrol(表头控件)

HKM 

Hotkeycontrol(热键控件)

IPM 

IPaddresscontrol(IP地址控件)

LB 

Listboxcontrol 

(列表框控件)

LVM 

Listviewcontrol(列表视图控件)

MCM 

Monthcalendarcontrol(数学日历控件)

PBM 

Progressbar(进度条控件)

PGM 

Pagercontrol()

PSM 

Propertysheet(属性页)

RB 

Rebarcontrol(分隔条控件)

SB 

Statusbarwindow(状态条控件)

SBM 

Scrollbarcontrol(滚动条控件)

STM 

Staticcontrol(静态控件)

TB 

Toolbar(工具条)

TBM 

Trackbar(跟踪栏)

TCM 

Tabcontrol(选项卡控件)

TTM 

Tooltipcontrol()

TVM 

Tree-viewcontrol()

UDM 

Up-downcontrol()

应用程序可以通过创建自定义的消息,用来和自己的窗口和其他进程通讯。

如果应用程序创建了自己的消息,窗口处理函数可以解析这些信息,并作出相应的处理。

消息标识符值的取值范围:

该系统保留了一个消息范围,从0x0000到0x03FF(0x03FF等于WM_USER-1)范围.这个范围内的值为系统定义的消息。

应用程序不能使用这些值作为自己的自定义消息。

从0x0400(数值WM_USER)到0x7FFF的值是为应用程序保留的。

应用程序可以使用这个范围内的值来定义自己的消息。

如果你的操作系用的版本(windowsversion)主版本为4.0版,你还可以使用0x8000(WM_APP)到0xBFF之间的值来定义自己的消息。

除此之外,应用程序还可以调用RegisterWindowMessage函数注册一个消息时,操作系统会返回一个介于0xC000和0xFFFF之间的一个消息标识符。

并且保证这个返回值是系统唯一的。

因此,可以避免和其他应用程序使用的消息相冲突。

3.消息派发

windows使用两种方法将消派发到一个窗口消息处理函数:

一是将消息放到消息队列(先进先出队列),二是不放到消息队列,直接发送到窗口消息处理函数,让窗口处理函数来处理消息。

派发到消息队列的消息被称为排队消息(Queuedmessages)。

它们主要是用户输入事件,比如说鼠标或键盘消息盘,有WM_MOUSEMOVE消息,WM_LBUTTONDOWN,WM_KEYDOWN,和WM_CHAR消息。

还有一些其他的,包括WM_TIMER,WM_PAINT,以及WM_QUIT。

大多数其他的消息息,这是直接发送到窗口过程,被称为非队列消息(nonqueuedmessages)。

(1)队列(Queued)消息

windows可同时显示任意数量的窗口。

此时,系统使用消息队列来将键盘和鼠标事件正确的派发到正确的窗口。

windows维护着一个系统消息队列,以及分别为每个GUI线程维护一个各自的线程消息队列。

为了避免非GUI线程的创建线程消息队列的开销,所有线程创建初始化时,均不创建消息队列。

只有当线程第一次调用GDI函数时,系统才会为线程创建消息队列。

所以那些非GUI线程是没有消息队列的。

每当用户移动鼠标,点击按钮或键盘时,鼠标或键盘的设备驱动程序会将输入转换成消息,并将消息放在系统消息队列里。

删windows会检查自己的消息队列,如果消息队列不为空,则每次取出并删除一个消息,然后确定消息的目标窗口,然后把消息放到创建这个窗口的线程的线程消息队列里。

线程的消息队列接收由线程创建的窗口的所有的鼠标和键盘消息。

然后线程会从队列中删除信息,并告诉系统把它们派发到对应的窗口消息处理函数。

除了WM_PAINT,WM_TIMER和WM_QUIT消息以外,系统总是派发放在在消息队列的末尾的消息。

这将保证让一个窗口以first-in,first-out的顺序接收消息。

WM_PAINT,WM_TIMER,和WM_QUIT消息,会一直被保存在队列中,只有在队列中没有其他消息时才会被派发到窗口消息处理函数。

此外,同一个窗口的多个WM_PAINT消息被合并成一个WM_PAINT消息,客户区的所有无效部分也会被合并。

这样是为了减少窗口重绘客户区的次数。

windows向线程消息队列传递消息时,首先会填充一个MSG结构,然后将这个MSG结构复制到消息队列。

MSG中的信息包括:

目标窗口,消息标识符,两个消息参数,消息派发时的时间,鼠标光标位置。

一个线程可以使用PostMessage或PostThreadMessage功能向自己的消息队列或者是其他线程的消息队列发送消息。

应用程序可以使用GetMessage函数从自己的消息队列中删除消息。

查看而不删除消息,用的是PeekMessage函数。

PeekMessage函数会返回一个带有消息信息的MSG结构。

从消息队列中删除消息后,应用程序可以使用DispatchMessage函数指示系统将消息发送到一个窗口消息处理函数。

DispatchMessage的参数是是前一次调用GetMessage或PeekMessage获得的MSG结构的指针。

DispatchMessage会传递窗口句柄,消息标识符,这两个消息参数这些信息给窗口消息处理函数,它不会传递消息派发时间以及鼠标光标位置。

应用程序可以在处理消息时调用的GetMessageTime和GetMessagePos来获得这些信息。

线程可以使用WaitMessage函数,交出自己的控制权,当它的消息队列中没有消息时,调用WaitMessage函数会挂起线程,直到自己的消息队列里有消息时才返回。

您可以调用SetMessageExtraInfo函数来关联一个值给当前线程的消息队列。

然后调用GetMessageExtraInfo函数来获取由GetMessage或PeekMessage函数得到的最后一条消息相关联的值。

你可以去msdn上看更多的关于这几个函数的信息。

(2)非队列(Nonqueued)消息

Nonqueued消息被立即送往目的地的窗口消息处理函数,绕过了系统的消息队列和线程消息队列。

系统通常会发送nonqueued消息,来通知那些会影响窗口的事件。

例如,当用户激活一个新的应用程序窗口时,系统会发送一些列消息到窗口,包括WM_ACTIVATE,WM_SETFOCUS,WM_SETCURSOR。

这些消息通知窗口被激活,键盘输入被定向到窗口,并且鼠标光标也移到窗口的边界内。

Nonqueued消息也有可能来源于应用程序调用系统函数。

例如,系统调用SetWindowPos函数移动一个窗口后会发送

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1