YR面試——windows訊息機制流程及SendMessage和PortMessage區別

來源:互聯網
上載者:User

這又是一道面試題,回來後趕緊總結一下哈。

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來決定是否將訊息保留在隊列中。

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.