win32 訊息機制

2021-08-25 22:35:21 字數 3094 閱讀 7837

本次使用的開發環境是vs2013,使用的開發語言是c/c++, 建立的專案是win32專案

windows

應用程式開始執行時,系統會為該程式建立乙個訊息

佇列用於存放訊息,然後用

getmessage

等進行訊息獲取處理。

程式從佇列中獲取訊息後處理

.分為系統訊息佇列(

有系統維護,

存放系統產生的訊息如鍵盤滑鼠訊息

)程式訊息佇列(

存放應用

程式訊息應用程式自行處理)

過程:事件->封裝訊息->投遞訊息佇列->訊息相應

備註:    //window最大的特色是良好的使用者互動性

//window是事件驅動的作業系統,事件怎麼驅動?通過訊息來驅動

//產生訊息、傳遞訊息、處理訊息的過程被稱為windows的訊息機制

//windows作業系統為每乙個視窗都提供了乙個訊息佇列

系統訊息

:系統已經定義好的訊息

wm_destry

等(0~0x03ff)

自定義訊息

:使用者自行定義

wm_user+10

等;(0x400~0x7fff)

佇列訊息

:訊息傳送和獲取都是在訊息佇列

(wm_paint,

滑鼠鍵盤定時器訊息)

getmessage--

從訊息佇列獲取訊息

postmessage-

將訊息投放到訊息佇列

非佇列訊息

:不進佇列直接訊息處理函式完成

(wm_create,wm_size)

typedef struct tagmsg msg

getmessage-

從訊息佇列中獲取乙個訊息後移除(堵塞

),當佇列中

無訊息獲取則等候下乙個訊息

peekmessage---

檢視訊息佇列中訊息

,非堵塞

,無訊息是返回

peekmessage()常用的一種用法:

//zeromemory(&msg, sizeof(msg));

//while (msg.message != wm_quit)//訊息的id不是退出訊息

////    }

sendmessage--把訊息傳送到指定視窗,直接訊息處理函式處理,獲取到返回結果後結束(堵塞)

postmessage--將訊息放入指定視窗訊息佇列,不等待結果直接返回(非堵塞)

translateaccelerator(msg.hwnd, hacceltable, &msg)            //翻譯快捷鍵

translatemessage(&msg);//翻譯訊息(並不是所有的訊息都需要翻譯, 翻譯後的訊息進訊息佇列)

dispatchmessage(&msg);//投遞訊息  投遞給訊息處理函式

//getmessage 是從訊息佇列一次取出乙個訊息,阻塞的過程,沒有訊息一直在等待,如果有訊息,分兩種情況

//一種得到普通的訊息,返回true;一種是得到乙個wm_quit(退出),返回false;

//peekmessage 從訊息佇列取訊息,非阻塞的過程 ,如果有訊息,返回true,如果沒有訊息,返回false

從當前程式的訊息佇列中進行查詢

,如果有訊息則判斷是否滿足視窗控制代碼

,id範圍等條件

.滿足的話取出訊息傳送給訊息處理函式後返回

,如果不滿足則向系統訊息佇列獲取屬於本程序的訊息

,如果找到滿足條件的則把系統中訊息佇列中的存入本程式訊息佇列中

.如果系統訊息佇列也沒有則檢查視窗是否重繪

,是則產生

wm_pait訊息,

然後返回處理

,如果沒有重繪

,檢視定時器有沒有需要處理

,有則產生

wm_timer訊息.

如果沒定時器則優化資源

,處理記憶體

.然後等候下乙個訊息

(peekmessage

不會等待

,會直接返回

false

後交出程式的控制權)

處理過程:查詢本程式訊息---> 如果訊息佇列有則判斷是否滿足條件(id)—>滿足取出訊息(不滿足不取)-->查視窗相關系統訊息(如無程式訊息)-->轉去程式訊息(如有)->檢查重繪(如無系統訊息)---->傳送wm_paint訊息----->檢查定時器(如無重畫)->整理程式資源記憶體->等待

1.

allocconsole() 為呼叫程序分配乙個新的控制台

2.獲取標準輸出

handle

g_h = getstdhandle(

std_output_handle)

3.char sztext[256] = ; sprintf(sztext, 「%s\n」, 「wm_size」 );

bool

writeconsole(

handle

hconsoleoutput,//操作的控制代碼

const

void

* lpbuffer,//需要寫入的內容

dword

nnumber, //寫入的位元組數

lpdword

lpnu,//指向接收實際寫入位元組數的變數指標可為null

lpvoid

lpreserved//必須為null    );

win32 訊息機制

2 windows訊息系統組成 訊息佇列 作業系統負責為程序維護乙個訊息佇列,程式執行時不斷地從訊息佇列進行訊息的獲取,處理訊息 訊息迴圈 應用程式不斷地獲取訊息,處理訊息構成訊息迴圈。3 win32訊息路由 1.訊息產生 2.系統將訊息排列到其應該排放的執行緒的訊息佇列中。3.執行緒中的訊息迴圈呼...

win32訊息機制

windows作業系統最大的特殊是良好的使用者互動性 訊息機制 產生訊息,傳遞訊息並處理訊息的過程 1.產生訊息 不可控 1 typedef struct tagmsg 2 msg 2.傳遞訊息 分成兩個部分,1 系統傳遞訊息給應用程式 不可控 2.應用程式傳遞訊息給應用程式 可控 windows作...

win32訊息機制 隨筆

windows訊息佇列的優先順序 如果需要改變乙個已有的計時器額時間間隔,可以使用不同的時間間隔再次呼叫settimer函式。如果乙個時鐘程式需要實現顯示描述或隱藏秒數的功能,就可以使用該方法。可以簡單的把 即使其的時間間隔設定未1000和6000毫秒之間。windows通過qs sendmessa...