對Windows訊息傳遞機制的總結

2021-04-12 13:40:17 字數 1103 閱讀 8894

當某應用程式有某一事件發生時,作業系統接受此訊息。訊息也分為佇列化和非佇列化的。佇列化的訊息由windows放入程式訊息佇列中,在程式的訊息迴圈中重新傳回並分配給視窗訊息處理程式(windosw呼叫winproc函式)。非佇列化的訊息在windows呼叫視窗時直接送給訊息處理程式。至於那些是佇列化,那些是非佇列化的,windows會處理。從視窗訊息處理程式的角度來看,這些訊息是以一種有序的、同步的方式進出的。視窗訊息處理程式可以處理它們,也可以不處理。

對於佇列化的訊息,應用程式通過下面**(也即訊息迴圈)進行訊息獲取和處理:

while (getmessage (&msg, null, 0, 0))

其中getmessage (&msg, null, 0, 0)傳給windows乙個指標,指向名為msg的msg結構。第

二、第三和第四個引數設定為null或者0,表示程式接收它自己建立的所有視窗的所有訊息。windows用從訊息佇列中取出的下乙個訊息來填充訊息結構的各個欄位.msg結構的各欄位如下:

typedef struct tagmsg

;translatemessage (&msg) ;

將msg結構傳給windows,進行一些鍵盤轉換。

dispatchmessage (&msg) ;

又將msg結構回傳給windows。然後,windows將該訊息傳送給適當的視窗訊息處理程式,讓它進行處理。

另外有一些值得注意的知識點:

1.winmain函式被指定了乙個winapi型態(在表頭檔案中定義的所有windows函式都被指定這種型態),而wndproc函式被指定乙個callback型態。這兩個識別符號都被定義為_stdcall,表示在windows本身和使用者的應用程式之間發生的函式呼叫的呼叫引數傳遞方式。

2.postmessage和sendmessage的區別:

postmessage 和sendmessage的區別主要在於是否等待其他程式訊息處理。postmessage只是把訊息放入佇列,不管其他程式是否處理都返回,然後繼續執行;而sendmessage必須等待其他程式處理訊息後才返回,繼續執行。這兩個函式的返回值也不同,postmessage的返回值表示postmessage函式執行是否正確,而sendmessage的返回值表示其他程式處理訊息後的返回值。  

訊息傳遞機制

objc msgsend函式 在oc語言裡面,訊息在執行時會繫結為 c語言 方法。編譯器會轉化乙個訊息表示式 receiver selector 任何在訊息中傳遞的引數也會被objc msgsend函式處理 objc msgsend receiver,selector,arg1,arg2,訊息傳遞函...

windows訊息機制

一 windows中有乙個系統訊息佇列,對於每乙個正在執行的windows應用程式,系統為其建立乙個 訊息佇列 即應用程式佇列,用來存放該程式可能 建立的各種視窗的訊息。應用程式中含有一段稱作 訊息迴圈 的 用來從訊息佇列中檢索這些訊息並把它們分發到相應的視窗函式中。二 windows為當前執行的每...

windows訊息機制

一 windows中有乙個系統訊息佇列,對於每乙個正在執行的windows應用程式,系統為其建立乙個 訊息佇列 即應用程式佇列,用來存放該程式可能 建立的各種視窗的訊息。應用程式中含有一段稱作 訊息迴圈 的 用來從訊息佇列中檢索這些訊息並把它們分發到相應的視窗函式中。二 windows為當前執行的每...