Windows程序消息机制浅析

1、消息

    消息是由MSG结构体来表示的。如下:

1 typedef struct tagMSG {
2   HWND   hwnd;
3   UINT   message;
4   WPARAM wParam;
5   LPARAM lParam;
6   DWORD  time;
7   POINT  pt;
8 } MSG

2、WinMain函数的定义

WinMain函数的原型声明如下:

1 int WINAPI WinMain(
2   HINSTANCE hInstance,            // handle to current instance
3   HINSTANCE hPrevInstance,        // handle to previous instance
4   LPSTR lpCmdLine,                // command line
5   int nCmdShow                    // show state
6 );

3、窗口的创建:设计一个窗口类、注册窗口类、创建窗口、显示及更新窗口。

设计一个窗口:WNDCLASS结构体的定义如下:

 1 typedef struct _WNDCLASS {
 2     UINT       style;
 3     WNDPROC    lpfnWndProc;
 4     int        cbClsExtra;
 5     int        cbWndExtra;
 6     HINSTANCE  hInstance;
 7     HICON      hIcon;
 8     HCURSOR    hCursor;
 9     HBRUSH     hbrBackground;
10     LPCTSTR    lpszMenuName;
11     LPCTSTR    lpszClassName;
12 } WNDCLASS;

注册窗口类:注册函数的原型声明如下:

1 ATOM RegisterClass(
2   CONST WNDCLASS *lpWndClass  // class data
3 );

创建窗口:CreateWindow函数的原型声明如下:

 1 HWND CreateWindow(
 2   LPCTSTR lpClassName,  // registered class name
 3   LPCTSTR lpWindowName, // window name
 4   DWORD dwStyle,        // window style
 5   int x,                // horizontal position of window
 6   int y,                // vertical position of window
 7   int nWidth,           // window width
 8   int nHeight,          // window height
 9   HWND hWndParent,      // handle to parent or owner window
10   HMENU hMenu,          // menu handle or child identifier
11   HINSTANCE hInstance,  // handle to application instance
12   LPVOID lpParam        // window-creation data
13 );

更新及更新窗口:显示窗口ShowWindow函数的原型声明如下:

1 BOOL ShowWindow(
2   HWND hWnd,     // handle to window
3   int nCmdShow   // show state
4 );

更新及更新窗口:更新窗口UpdateWindow函数的原型声明如下:

1 BOOL UpdateWindow(HWND hWnd);

4、消息循环:不断从消息队列中取出消息,并进行响应。

1 BOOL GetMessage(
2   LPMSG lpMsg,         // message information
3   HWND hWnd,           // handle to window
4   UINT wMsgFilterMin,  // first message
5   UINT wMsgFilterMax   // last message
6 );

Windows应用程序消息处理机制如下图所示:

  

  1. 操作系统接收到应用程序的窗口消息,将消息投递到应用程序的消息队列中。
  2. 应用程序在消息循环中调用GetMessage函数从消息队列中取出一条一条的消息。取出消息后,应用程序可以对消息进行一些预处理,例如,放弃对某些消息的响应,或者调用TranslateMessage产生新的消息。
  3. 应用程序调用DispatchMessage,将消息回传给操作系统。消息是由MSG结构体对象来表示的,其中就包含了接收消息的窗口的句柄。因此,DispatchMessage函数总能进行正确的传递。
  4. 系统利用WNDCLASS结构体的lpfnWndProc成员保存的窗口过程函数的指针调用窗口过程,对消息进行处理(即“系统给应用程序发送了消息”)。

5、编写窗口过程函数:窗口过程函数的声明形式如下:

1 LRESULT CALLBACK WindowProc(
2   HWND hwnd,      // handle to window
3   UINT uMsg,      // message identifier
4   WPARAM wParam,  // first message parameter
5   LPARAM lParam   // second message parameter
6 );

提示:系统通过窗口过程函数的地址(指针)来调用窗口过程函数,而不是名字。

例:WinMain.cpp

 1 #include <windows.h>
 2 #include <stdio.h>
 3
 4 LRESULT CALLBACK WinSunProc(
 5                   HWND hwnd,      // handle to window
 6                   UINT uMsg,      // message identifier
 7                   WPARAM wParam,  // first message parameter
 8                   LPARAM lParam   // second message parameter
 9                 );
10
11 int WINAPI WinMain(
12             HINSTANCE hInstance,      // handle to current instance
13             HINSTANCE hPrevInstance,  // handle to previous instance
14             LPSTR lpCmdLine,          // command line
15             int nCmdShow              // show state
16            )
17 {
18     WNDCLASS wndcls;
19     wndcls.cbClsExtra=0;
20     wndcls.cbWndExtra=0;
21     wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
22     wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);
23     wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);
24     wndcls.hInstance=hInstance;
25     wndcls.lpfnWndProc=WinSunProc;
26     wndcls.lpszClassName="bedrock32";
27     wndcls.lpszMenuName=NULL;
28     wndcls.style=CS_HREDRAW | CS_VREDRAW;
29     RegisterClass(&wndcls);
30
31     HWND hwnd;
32     hwnd=CreateWindow("bedrock32","http://www.cnblogs.com/bedrock32",WS_OVERLAPPEDWINDOW,
33         0,0,600,400,NULL,NULL,hInstance,NULL);
34
35     ShowWindow(hwnd,SW_SHOWNORMAL);
36     UpdateWindow(hwnd);
37
38     MSG msg;
39     while(GetMessage(&msg,NULL,0,0))
40     {
41         TranslateMessage(&msg);
42         DispatchMessage(&msg);
43     }
44     return msg.wParam;
45 }
46
47 LRESULT CALLBACK WinSunProc(
48                   HWND hwnd,      // handle to window
49                   UINT uMsg,      // message identifier
50                   WPARAM wParam,  // first message parameter
51                   LPARAM lParam   // second message parameter
52                 )
53 {
54     switch(uMsg)
55     {
56     case WM_CHAR:
57         char szChar[20];
58         sprintf(szChar,"char code is %d",wParam);
59         MessageBox(hwnd,szChar,"char",0);
60         break;
61     case WM_LBUTTONDOWN:
62         MessageBox(hwnd,"mouse clicked","message",0);
63         HDC hdc;
64         hdc=GetDC(hwnd);
65         TextOut(hdc,0,50,"我是高手",strlen("我是高手"));
66         //ReleaseDC(hwnd,hdc);
67         break;
68     case WM_PAINT:
69         HDC hDC;
70         PAINTSTRUCT ps;
71         hDC=BeginPaint(hwnd,&ps);
72         TextOut(hDC,0,0,"http://www.cnblogs.com/bedrock32",strlen("http://www.cnblogs.com/bedrock32"));
73         EndPaint(hwnd,&ps);
74         break;
75     case WM_CLOSE:
76         if(IDYES==MessageBox(hwnd,"是否真的结束?","message",MB_YESNO))
77         {
78             DestroyWindow(hwnd);
79         }
80         break;
81     case WM_DESTROY:
82         PostQuitMessage(0);
83         break;
84     default:
85         return DefWindowProc(hwnd,uMsg,wParam,lParam);
86     }
87     return 0;
88 }

时间: 2024-10-01 02:35:53

Windows程序消息机制浅析的相关文章

windows程序消息机制(Winform界面更新有关)--转

1. Windows程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着消息泵.这个消息泵让windows程序生生不息. Windows程序有个消息队列,窗体上的所有消息是这个队列里面消息的最主要来源.这里的While循环使用了GetMessage() 这个方法,这是个阻塞方法,也就是队列为空时方法就会阻塞,从而这个While循环停止运动,这避免了一个程序把cpu无缘无故的耗尽,让其他程序难以得到响应.当然在某些需要cpu最大限度运动的程序里面就可以使用另外的方法,例如某些

windows程序消息机制(Winform界面更新有关)

windows程序消息机制(Winform界面更新有关) 转自:http://www.cnblogs.com/blosaa/archive/2013/05/31/3109586.html 1. Windows程序消息机制 Windows GUI程序是基于消息机制的,有个主线程维护着消息泵.这个消息泵让windows程序生生不息. Windows程序有个消息队列,窗体上的所有消息是这个队列里面消息的最主要来源.这里的While循环使用了GetMessage() 这个方法,这是个阻塞方法,也就是队列

【C#】Windows程序消息机制

一.Windows程序消息机制 1.Windows程序消息机制使用消息队列实现. (1).UI线程为主线程,用于管理整个窗体以及子控件的运行. (2).窗体上的所有消息是消息队列的主要来源. (3).PeekMessage.GetMessage用于查看应用程序消息队列,有消息时将队列中的消息派发出去. GetMessage只有在消息队列中有消息时返回,队列中无消息GetMessage就会一直等,直至下一个消息出现时才返回.在等的这段时间,应用程序不能执行任何指令.即:当队列为空,GetMessa

6.windows的消息机制 重要!重要!重要!

所谓程序执行机制分为: 过程驱动:程序的执行过程总是按照预定好的顺序执行. 事件驱动:程序的执行是无序的,用户可以根据需要随机出发相应的事件. win32窗口程序就是采用事件驱动方式执行,也就是消息机制. 什么是消息? 当系统通知窗口工作时,就采用消息的方式派发给窗口. 消息的组成:(windows平台下消息必须由这6个部分组成) 窗口句柄 消息ID 消息的两个参数(两个附带信息) 消息的产生时间 消息产生时的鼠标位置 DispatchMessage( &nMsg )是怎么派发消息(其实就是调用

从0 开始 WPF MVVM 企业级框架实现与说明 ---- 第一讲 WPF中 windows消息机制

谈到桌面应用程序,我们第一反应就是它的消息机制是怎么处理的,那么我们就先聊聊这个windows消息机制 谈起“消息机制”这个词,我们都会想到Windows的消息机制,系统将键盘鼠标的行为包装成一个Windows Message,然后系统主动将这些Windows Message派发给特定的窗口,实际上消息是被Post到特定窗口所在线程的消息队列,应用程序的消息循环再不断的从消息队列当中获取消息,然后再派发给特定窗口类的窗口过程来处理,在窗口过程中完成一次用户交互. 其实,WPF的底层也是基于Win

深入Delphi -- Windows 消息机制

http://www.txsz.net/xs/delphi/3/Windows%20%E6%B6%88%E6%81%AF%E6%9C%BA%E5%88%B6.htm Windows 消息机制 by machine 大家是不是很奇怪为什么我还没说到Delphi的控件呢? 不过不用着急,有关深入控件的内容,将会很快出现了,但在这之前, 还得了解Windows图形界面程序的机制--Windows的消息机制. 使用过Delphi的朋友都知道,Delphi是一个真正面向对象的编程环境, 但是不但如此,De

Android Handler消息机制

在上一篇文章<Android AsyncTask异步任务>中我们介绍了如何使用AsyncTask异步处理网络通信和UI更新.在本文中将使用Handler消息机制来异步处理网络通信和UI更新. Google参考了Windows的消息机制,在Android系统中实现了一套类似的消息机制.学习Android的消息机制,有几个概念(类)必须了解: 1.Message 消息,理解为线程间通讯的数据单元.例如后台线程在处理数据完毕后需要更新UI,则可发送一条包含更新信息的Message给UI线程. 2.M

windows进程消息间的传递方式

1 文件映射 文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待.因此,进程不必使用文件I/O操作,只需简单的指针操作就可读取和修改文件的内容. Win32 API允许多个进程访问同一文件映射对象,各个进程在它自己的地址空间里接收内存的指针.通过使用这些指针,不同进程就可以读或修改文件的内容,实现了对文件中数据的共享. 应用程序有三种方法来使多个进程共享一个文件映射对象. (1)继承:第一个进程建立文件映射对象,它的子进程继承该对象的句柄. (

Windows消息机制驱动的客户端程序GetMssage()

要从消息队列中取出消息,我们需要调用GetMessage()函数,该函数的原型声明如下: BOOL GetMessage( LPMSG lpMsg,              // address of structure with message HWND hWnd,                 // handle of window UINT wMsgFilterMin,       // first message UINT wMsgFilterMax        // last m