YR面试——windows消息机制流程及SendMessage和PortMessage区别

来源:互联网 发布:mac官网彩妆 编辑:程序博客网 时间:2024/05/16 16:19

这又是一道面试题,回来后赶紧总结一下哈。

Windows操作系统最大的特点就是其图形化的操作界面,其图形化界面是建立在其消息处理机制这个基础之上的。

一。在windows中有一个系统消息队列,对于每一个正在执行的windows应用程序,系统为其建立一个用来存放可能创建的各种窗口的消息即的应用程序队列——“消息队列”。应用程序中有一段称作“消息循环”的代码。

while(GetMessage (&msg, NULL, 0, 0))       
{        
    TranslateMessage (&msg) ;        
    DispatchMessage (&msg) ;       
}

msg变量是型态为MSG的结构,型态MSG在WINUSER.H中定义如下:
typedef struct tagMSG       
{       
    HWND   hwnd ;        
    UINT   message ;        
    WPARAM wParam ;        
    LPARAM lParam ;        
    DWORD  time ;        
    POINT  pt ;       
}       
MSG, * PMSG ;
      
POINT数据型态也是一个结构,它在WINDEF.H中定义如下:
typedef struct tagPOINT       
{       
    LONG  x ;       
    LONG  y ;       
}       
POINT, * PPOINT;
TranslateMessage(&msg); 将msg结构传给Windows,进行一些键盘转换。(关于这一点,我们将在第六章中深入讨论。)
DispatchMessage(&msg);又将msg结构回传给Windows。然后,Windows将该消息发送给适当的窗口消息处理程序,让它进行处理。这也就是说,Windows将呼叫窗口消息处理程序。在HELLOWIN中,这个窗口消息处理程序就是WndProc函数。处理完消息之后,WndProc传回到Windows。此时,Windows还停留在DispatchMessage呼叫中。在结束DispatchMessage呼叫的处理之后,Windows回到HELLOWIN程序中,并且接着从下一个GetMessage呼叫开始消息循环。

 

 

 SendMessage()与PostMessage()之间的区别:

它们两者是用于向应用程序发送消息的。PostMessagex()将消息直接加入到应用程序的消息队列中,不等程序返回就退出;而SendMessage()则刚好相反,应用程序处理完此消息后,它才返回。我想下图能够比较好的体现这两个函数的关系:


 

 函数peekmessage和getmessage的区别?


1.GetMessage将等到有合适的消息时才返回,而PeekMessage只是撇一下消息队列。
2.GetMessage会将消息从队列中删除,而PeekMessage可以设置最后一个参数wRemoveMsg来决定是否将消息保留在队列中。

 

 

 

原创粉丝点击