现在的位置: 首页 > 综合 > 正文

windows消息驱动机制

2018年03月19日 ⁄ 综合 ⁄ 共 988字 ⁄ 字号 评论关闭

1. Windows应用程序都是消息(事件)驱动的,任何一个窗口都能够接收消息,并对该消息做出相应的处理。Windows应用程序的消息来源有4种:输入消息(键盘、鼠标输入),控制消息,系统消息,用户消息。

2. Windows是一个多任务操作系统,没有某个应用程序能够独占系统资源,那么系统如何处理各个应用程序的消息呢?这就需要为各个不同的应用程序建立一个消息队列。消息队列中的消息分为两大类:

1)入队消息(OS将产生的消息放在应用程序的消息队列中,让应用程序来处理) PostMessage发送的是入队消息

2)不入队消息(OS直接调用窗口的处理过程)SendMessage发送的是非入队消息

3. 消息的定义

typedef struct MSG {       
      HWND   hwnd; //窗口句柄,即标示消息所属的窗口     
      UINT   message;//标示消息的类别,是鼠标还是键盘等 如鼠标左键按下消息是WM_LBUTTONDOWN,键盘按下消息是WM_KEYDOWN,字符消息是WM_CHAR
      WPARAM wParam;//消息的附加信息
      LPARAM lParam;//消息的附加信息
      DWORD  time;//消息投递到消息队列中的时间
      POINT  pt;//鼠标的当前位置
   } MSG;

4. 消息循环

  while(GetMessage(&msg,NULL,0,0)){//接收到WM_QUIT消息时,才返回0
     TranslateMessage(&msg);//对消息进行包装处理然后再以消息的形式投放到消息队列
     DispatchMessage(&msg);//消息回传给操作系统,由操作系统调用窗口过程函数对消息进行处理
 }

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

4)系统利用WNDCLASS结构体的lpfnWndProc成员保存的窗口过程函数的指针调用窗口过程,对消息进行处理(即“系统给应用程序发送了消息”)。



抱歉!评论已关闭.