1. 窗口过程
每个窗口会有一个称为窗口过程的回调函数(WndProc),它带有四个参数,分别为:窗口句柄(Window Handle),消息ID(Message ID),和两个消息参数(wParam, lParam), 当窗口收到消息时系统就会调用此窗口过程来处理消息。(所以叫回调函数)
2 消息类型
1) 系统定义消息(System-Defined Messages)
在SDK中事先定义好的消息,非用户定义的,其范围在[0x0000, 0x03ff]之间, 可以分为以下三类:
1> 窗口消息(Windows Message)
与窗口的内部运作有关,如创建窗口,绘制窗口,销毁窗口等。可以是一般的窗口,也可以是Dialog,控件等。
如:WM_CREATE, WM_PAINT, WM_MOUSEMOVE, WM_CTLCOLOR, WM_HSCROLL...
2> 命令消息(Command Message)
与处理用户请求有关, 如单击菜单项或工具栏或控件时, 就会产生命令消息。
WM_COMMAND, LOWORD(wParam)表示菜单项,工具栏按钮或控件的ID。如果是控件, HIWORD(wParam)表示控件消息类型
3> 控件通知(Notify Message)
控件通知消息, 这是最灵活的消息格式, 其Message, wParam, lParam分别为:WM_NOTIFY, 控件ID,指向NMHDR的指针。NMHDR包含控件通知的内容, 可以任意扩展。
2) 程序定义消息(Application-Defined Messages)
用户自定义的消息, 对于其范围有如下规定:
WM_USER: 0x0400-0x7FFF (ex. WM_USER+10)
WM_APP(winver> 4.0): 0x8000-0xBFFF (ex.WM_APP+4)
RegisterWindowMessage: 0xC000-0xFFFF
3 消息队列(Message Queues)
Windows中有两种类型的消息队列
1) 系统消息队列(System Message Queue)
这是一个系统唯一的Queue,设备驱动(mouse, keyboard)会把操作输入转化成消息存在系统队列中,然后系统会把此消息放到目标窗口所在的线程的消息队列(thread-specific message queue)中等待处理
2) 线程消息队列(Thread-specific Message Queue)
每一个GUI线程都会维护这样一个线程消息队列。(这个队列只有在线程调用GDI函数时才会创建,默认不创建)。然后线程消息队列中的消息会被送到相应的窗口过程(WndProc)处理.
注意: 线程消息队列中WM_PAINT,WM_TIMER只有在Queue中没有其他消息的时候才会被处理,WM_PAINT消息还会被合并以提高效率。其他所有消息以先进先出(FIFO)的方式被处理。
4 队列消息(Queued Messages)和非队列消息(Non-Queued Messages)
1)队列消息(Queued Messages)
消息会先保存在消息队列中,消息循环会从此队列中取消息并分发到各窗口处理
如鼠标,键盘消息。
2) 非队列消息(NonQueued Messages)
消息会绕过系统消息队列和线程消息队列直接发送到窗口过程被处理
如: WM_ACTIVATE, WM_SETFOCUS, WM_SETCURSOR, WM_WINDOWPOSCHANGED
注意: postMessage发送的消息是队列消息,它会把消息Post到消息队列中; SendMessage发送的消息是非队列消息, 被直接送到窗口过程处理
5 PostMessage(PostThreadMessage), SendMessage
PostMessage:把消息放到指定窗口所在的线程消息队列中后立即返回。 PostThreadMessage:把消息放到指定线程的消息队列中后立即返回。
SendMessage:直接把消息送到窗口过程处理, 处理完了才返回。
6 GetMessage, PeekMessage
PeekMessage会立即返回 可以保留消息
GetMessage在有消息时返回 会删除消息
7 TranslateMessage, TranslateAccelerator
TranslateMessage: 把一个virtual-key消息转化成字符消息(character message),并放到当前线程的消息队列中,消息循环下一次取出处理。
TranslateAccelerator: 将快捷键对应到相应的菜单命令。它会把WM_KEYDOWN 或 WM_SYSKEYDOWN转化成快捷键表中相应的WM_COMMAND 或WM_SYSCOMMAND消息, 然后把转化后的 WM_COMMAND或WM_SYSCOMMAND直接发送到窗口过程处理, 处理完后才会返回。
8(消息死锁( Message Deadlocks)
假设有线程A和B, 现在有以下下步骤
1) 线程A SendMessage给线程B, A等待消息在线程B中处理后返回
2) 线程B收到了线程A发来的消息,并进行处理, 在处理过程中,B也向线程A SendMessgae,然后等待从A返回。
因为此时, 线程A正等待从线程B返回, 无法处理B发来的消息, 从而导致了线程A,B相互等待, 形成死锁。多个线程也可以形成环形死锁。
可以使用 SendNotifyMessage或SendMessageTimeout来避免出现死锁。
9 BroadcastSystemMessage
我们一般所接触到的消息都是发送给窗口的, 其实, 消息的接收者可以是多种多样的,它可以是应用程序(applications), 可安装驱动(installable drivers), 网络设备(network drivers), 系统级设备驱动(system-level device drivers)等,
BroadcastSystemMessage这个API可以对以上系统组件发送消息。
分享到:
相关推荐
在.NET框架中,C#作为高级编程语言,虽然提供了丰富的类库,但...熟练掌握这些要点,可以帮助开发者充分利用Windows系统的功能,扩展C#应用程序的能力。在实际项目中,应遵循最佳实践,确保代码的稳定性和可维护性。
Windows API提供了丰富的系统级服务,而C#作为一种高级语言,通过P/Invoke(Platform Invoke)机制可以直接与这些API进行交互。以下是一些关于C#中调用Windows API的关键知识点: 1. **P/Invoke**:P/Invoke是.NET ...
Windows系统安全机制介绍 操作系统安全是计算机安全的基础组件,作为操作系统的安全机制是保护计算机系统的安全和完整性的关键。操作系统安全机制的主要目标是标识和鉴别系统中的用户和进行身份鉴别,依据系统安全...
无论是游戏开发还是其他类型的Windows应用程序开发,都需要对Windows API、GDI函数、消息机制等有深刻的理解。随着技术的不断发展,尽管有更高级的框架和工具可供选择,但掌握底层的编程原理仍然是非常必要的。
### Windows 7 软件开发要点:UAC、系统版本、权限 #### 一、引言 随着Windows 7 的发布,许多个人开发者都希望能够让自己的中小软件在这全新的平台上运行顺畅。为了确保软件能够在Windows 7 下稳定运行,开发者...
通过上述介绍,我们可以了解到Windows编程的基本概念和技术要点。掌握好API的使用方法以及理解事件驱动的原理,对于编写高质量的Windows应用程序至关重要。希望这篇指南能够帮助初学者顺利入门Windows编程的世界。
P/Invoke是.NET Framework提供的一种机制,使得托管代码(如C#)可以调用非托管代码(如C/C++编写的Windows API)。要使用P/Invoke,你需要在C#程序中定义一个方法,该方法使用`[DllImport]`特性来指定API函数所在的...
学习MFC可以帮助开发者掌握Windows编程的核心知识,尤其是在消息处理机制方面。MFC框架封装了Windows API,为Windows编程提供了一个面向对象的界面,使得开发者能够更加便捷地开发出功能丰富、界面友好的应用程序。 ...
《Windows原理与应用》是一本深入探讨Windows操作系统核心机制与实际应用的教材。复习要点主要集中在以下几个关键领域: 1. **功能与概念**:这部分涵盖了Windows操作系统的主要版本,如Win 2000 Professional、...
首先,我们要理解Windows消息机制。在Windows API中,每个用户界面操作都会产生一个消息,这些消息会被放入应用程序的消息队列中。应用程序通过调用消息循环(Message Loop)来处理这些消息。在易语言中,我们可以...
书中通过实例展示了Windows下常见的IPC机制,如管道、消息队列、共享内存等,并提供了实际应用场景分析。 - **文件系统管理**:文件系统是操作系统的重要组成部分之一。本书深入剖析了Windows文件系统的结构与特性...
根据提供的文件信息,我们将重点解析“Windows内核设计思想”这一主题,并深入探讨与之相关的技术要点、设计理念以及实现机制。 ### Windows内核设计思想概述 #### 一、Windows内核简介 Windows操作系统的核心部分...
- **问题背景**:在尝试初始化一个Windows Azure Queue连接时,不断收到错误消息。 - **解决方法**:确保队列名称中不包含非法字符。 - **技术要点**: - **队列名称规则**:Windows Azure Queue服务对队列名称有...
这对于初学者来说是非常宝贵的资源,可以帮助他们更快地理解Windows编程的基本概念和技术要点。通过实践这段代码,学习者可以更好地掌握Windows编程的核心知识,并为进一步开发复杂的应用程序打下坚实的基础。