Windows程序开发的背景知识---Windows消息机制

一,消息

消息(Message)指的就是Windows 操作系统发给应用程序的一个通知,它告诉应用程序某个特定的事件发生了。比如,用户单击鼠标或按键都会引发Windows 系统发送相应的消息。最终处理消息的是应用程序的窗口函数,如果程序没处理的话操作系统有默认函数将会作出处理。
     从数据结构的角度来说,消息是一个结构体,它包含了消息的类型标识符以及其他的一些附加信息。系统定义的结构体MSG用于表示消息,MSG 具有如下定义形式:
typedef struct MSG
{
     HWND hwnd;                    //hwnd 是窗口的句柄,这个参数将决定由哪个窗口过程函数对消息进行处理 
     UINT message;                  //message是一个消息常量,用来表示消息的类型 
     WPARAM wParam;            //32 位的附加信息,具体表示什么内容,要视消息的类型而定 
     LPARAM lParam;               //32 位的附加信息,具体表示什么内容,要视消息的类型而定 
     DWORD time;                   //time 是消息发送的时间 
     POINT pt;                         //消息发送时鼠标所在的位置 
}

二,Windows编程原理

Windows 是一消息(Message)驱动式系统,Windows 消息提供了应用程序与应用程序之间、应用程序与Windows 系统之间进行通讯的手段。应用程序要实现的功能由消息来触发,并靠对消息的响应和处理来完成。Windows 系统中有两种消息队列,一种是系统消息队列,另一种是应用程序消息队列。计算机的所有输入设备由 Windows 监控,当一个事件发生时,Windows 先将输入的消息放入系统消息队列中,然后再将输入的消息拷贝到相应的应用程序队列中,应用程序中的消息循环从它的消息队列中检索每一个消息并发送给相应的窗口函数中。

箭头1 说明操作系统能够操纵输入输出设备,例如让打印机打印;

箭头2 说明操作系统能够感知输入输出设备的状态变化,如鼠标单击,按键按下等,这就是操作系统和计算机硬件之间的交互关系

箭头3 是应用程序通知操作系统执行某个具体的操作,这是通过调用操作系统的API 来实现的;

箭头4 操作系统能够感知硬件的状态变化,但是并不决定如何处理,而是把这种变化封装成消息转交给应用程序,由应用程序决定如何处理,箭头4说明了这种转交情况。

三,Windows消息循环

消息循环是Windows 应用程序存在的根本,应用程序通过消息循环获取各种消息,并通过相应的窗口过程函数,对消息加以处理;正是这个消息循环使得一个应用程序能够响应外部的各种事件。

Windows 操作系统为每个线程维持一个消息队列,当事件产生时,操作系统感知这一事件的发生,并包装成消息发送到消息队列,应用程序通过GetMessage()函数取得消息并存于一个消息结构体中,然后通过一个TranslateMessage()和DispatchMessage()解释和分发消息,下面的代码描述了Windows 的消息循环。

while(GetMessage (&msg, NULL, 0, 0))
{
     TranslateMessage (&msg) ;
     DispatchMessage (&msg) ;
}
TranslateMessage(&msg)对于大多数消息而言不起作用,但是有些消息,比如键盘按键按下和弹起(分别对于KeyDown 和KeyUp 消息),却需要通过它解释,产生一个WM_CHAR消息。DispatchMessage(&msg)负责把消息分发到消息结构体中对应的窗口,交由窗口过程函数处理。GetMessage()在取得WM_QUIT 之前的返回值都为TRUE,也就是说只有获取到WM_QUIT 消息才返回FALSE,才能跳出消息循环。

对一个Windows窗体程序而言,在Program.cs文件中的Main函数中,有如下的代码:

Application.Run(new Form1());

这行代码的意思就是在当前线程上开始运行标准应用程序消息循环,并使指定窗体可见。实际上就是启动了一个GetMessage的无限循环。而这个响应Windows消息的线程就被称做Windows窗体程序的UI线程

四,主要函数的区别

SendMessage()与PostMessage()是用于向应用程序发送消息的。SendMessage()将消息直接加入到应用程序的消息队列中,在应用程序处理完此消息后,它才返回。PostMessagex()将消息直接加入到应用程序的消息队列中,不等程序返回就退出。

PeekMessage和GetMessage用来从消息队列中取出数据,GetMessage从消息队列里取得一个消息并将其放于指定的结构,获取消息成功后,线程将从消息队列中删除该消息。GetMessage函数会一直等待直到有消息到来才有返回值。PeekMessage函数检查消息队列,并将该消息(如果存在)放于指定的结构,然后返回,不会等待。

时间: 2024-08-04 13:37:32

Windows程序开发的背景知识---Windows消息机制的相关文章

MFC Windows程序开发究竟是什么?

MFC Windows程序开发究竟是什么? MFC是一个Application Framework.他是一个完整的程序模型. 什么是MFC?MFC是微软公司出品一个Application Framework.基本上,我们可以认为Application Framework就是一个完整的程序模型,具备标准软件所需的一切基本功能,比如文件存取.打印等等.从C++语言层面来看,Application Framework就是有一整套组合好的“对象”构建起来的模型.从C++语法上来说,MFC就是一套微软提供

C语言Windows程序开发—TextOut函数介绍【第02天】

(一)TextOut函数的参数介绍: 1 BOOL TextOut ( //如果函数调用成功,返回TRUE,否则,返回FALSE 2 HDC hdc, //用于显示字符串的控件ID 3 int nXStart, //字符串所在起始位置左上角(X,Y)的X坐标 4 int nYStart, //字符串所在起始位置左上角(X,Y)的Y坐标 5 LPCTSTR lpString, //显示的字符串内容 6 int cbString //字符串长度 7 ) ; 函数调用示例: 1 TextOut ( h

C语言Windows程序开发—CreateWindow函数介绍【第03天】

(一)CreateWindow函数的参数介绍: 1 HWND CreateWindow( 2 LPCTSTR lpClassName, //Windows窗口中预定义的控件结构体,包括:BUTTON(按钮),EDIT(文本框),LISTBOX(列表),MDICLIENT(子窗口),SCROLLBAR(滚动条),RICHEDIT(富文本),STATIC(静态控件): 3 LPCTSTR lpWindowName, //窗口控件中显示的内容,即Caption属性: 4 DWORD dwStyle,

Windows程序开发必须知道的几个注册表项

1.Windows服务程序列表位置 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services 2.卸载程序列表位置 32位系统 当前用户软件HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 所有用户软件HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall 64位系统 当前用

C语言Windows程序开发—MessageBox函数介绍【第01天】

(一)MessageBox函数的参数介绍: 1 int MessageBox ( 2 HWND hWnd, //弹出MessageBox对话框所属的窗口句柄 3 LPCTSTR lpText, //指向MessageBox对话框内容的字符串指针 4 LPCTSTR lpCaption, //指向MessageBox对话框标题的字符串指针 5 UINT uType //MessageBox对话框的风格 6 ) ; 函数调用示例: 1 MessageBox ( NULL, TEXT ("程序运行出错

windows程序开发窗口截图实现一

1.2编写窗口截图 本次选择窗口截图一共3步:鼠标按下.移动.弹起. 知识点:改变鼠标图标.截图函数封装.窗口画图 本节新学习AIP: LoadCursor SetCursor(m_hCursor); SetCapture(); CreateDC CreateCompatibleDC CreateCompatibleBitmap ClientToScreen WindowFromPoint CreateSolidBrush FrameRect -------------.. 视频观看地址: ht

第三章—Windows程序

这一章我都不知道该如何写了,呵呵~~ 毕竟,Win32是一个非常深奥的系统,目前还容不得我这种 小辈在这儿说三道四,不过,我既然是要写给那些入门阶段的朋友们看的,又不是写给那些搞程序设计老鸟看的,所以,我也犯不着怕被人背后指着骂 本章的名字就叫<Windows程序>而不是<Windows程序设计>所以,我只是讲一些关于Windows程序运作的原理: Windows 为什么叫Windows,相信所有用过的朋友都可以明白,那桌面上一个一个的窗口,就是它名字的由来.也就是这一个又一个窗口

Windows程序代码重构

代码重构:在程序功能实现之后,对代码进行一定规模的整理,使之符合"高内聚.低耦合"的软件设计原则,便于维护和使用. ①用函数封装消息处理代码--对Windows程序窗口函数中的每一个case程序段进行封装以形成一个消息处理函数,而在case中调用这个函数. ②利用数组或链表实现消息映射表进一步实现代码的隔离--因为窗口函数switch-case结构实质上实现的就是一个根据消息标识来查找消息处理代码的功能,故可以用消息映射表和一段查表程序来替代它,表中的每一项可以使用一个函数指针来指向消

盘点那些快速打开windows程序的快捷键

很多时候,快捷键带给我们的不仅仅是快速,还能带给我们一种心灵上的满足感.试想一下,别人都在中规中矩的用鼠标点,一步步慢慢调出所需要程序,而你却可以直接通过一个快捷键就完成了,是不是感觉特别有成就呢?今天就给大家整理了打开windows程序的常用快捷命令,windows系统拥护者的朋友们赶紧来转走收藏吧. 注:开始菜单中的"运行"是通向程序的快捷途径,输入特定的命令后,即可快速的打开Windows的大部分程序. winver检查Windows版本 wmimgmt.msc 打开Window