1. 視窗過程
每個視窗會有乙個稱為視窗過程的**函式(wndproc),它帶有四個引數,分別為:視窗控制代碼(window handle),訊息id(message id),和兩個訊息引數(wparam, lparam), 當視窗收到訊息時系統就會呼叫此視窗過程來處理訊息。(所以叫**函式)
2 訊息型別
1) 系統定義訊息(system-defined messages)
在sdk中事先定義好的訊息,非使用者定義的,其範圍在[0x0000, 0x03ff]之間, 可以分為以下三類:
1> 視窗訊息(windows message)
與視窗的內部運作有關,如建立視窗,繪製視窗,銷毀視窗等。可以是一般的視窗,也可以是dialog,控制項等。
如:wm_create, wm_paint, wm_mousemove, wm_ctlcolor, wm_hscroll...
2> 命令訊息(command message)
與處理使用者請求有關, 如單擊選單項或工具欄或控制項時, 就會產生命令訊息。
wm_command, loword(wparam)表示選單項,工具欄按鈕或控制項的id。如果是控制項, hiword(wparam)表示控制項訊息型別
3> 控制項通知(notify message)
3 訊息佇列(message queues)
windows中有兩種型別的訊息佇列
1) 系統訊息佇列(system message queue)
這是乙個系統唯一的queue,裝置驅動(mouse, keyboard)會把操作輸入轉化成訊息存在系統佇列中,然後系統會把此訊息放到目標視窗所在的執行緒的訊息佇列(thread-specific message queue)中等待處理
2) 執行緒訊息佇列(thread-specific message queue)
4 佇列訊息(queued messages)和非佇列訊息(non-queued messages)
1)佇列訊息(queued messages)
訊息會先儲存在訊息佇列中,訊息迴圈會從此佇列中取訊息並分發到各視窗處理
如滑鼠,鍵盤訊息。
2) 非佇列訊息(nonqueued messages)
訊息會繞過系統訊息佇列和執行緒訊息佇列直接傳送到視窗過程被處理
如: wm_activate, wm_setfocus, wm_setcursor, wm_windowposchanged
注意: postmessage傳送的訊息是佇列訊息,它會把訊息post到訊息佇列中; sendmessage傳送的訊息是非佇列訊息, 被直接送到視窗過程處理
5 postmessage(postthreadmessage), sendmessage
postmessage:把訊息放到指定視窗所在的執行緒訊息佇列中後立即返回。 postthreadmessage:把訊息放到指定執行緒的訊息佇列中後立即返回。
sendmessage:直接把訊息送到視窗過程處理, 處理完了才返回。
6 getmessage, peekmessage
7 translatemessage, translateaccelerator
translatemessage: 把乙個virtual-key訊息轉化成字元訊息(character message),並放到當前執行緒的訊息佇列中,訊息迴圈下一次取出處理。
translateaccelerator: 將快捷鍵對應到相應的選單命令。它會把wm_keydown 或 wm_syskeydown轉化成快捷鍵表中相應的wm_command 或wm_syscommand訊息, 然後把轉化後的 wm_command或wm_syscommand直接傳送到視窗過程處理, 處理完後才會返回。
8(訊息死鎖( message deadlocks)
9 broadcastsystemmessage
一、引言
隨著windows作業系統的不斷推廣,眾多軟體開發包都提供有開發基於windows平台應用軟體的功能。雖然這些開發包不盡相同,流行的有visual c++、visual basic、delphi、c++ builder 等多種,但由這些不同語言開發的軟體有一點卻是相同的--都是執行於windows 操作平台,都必須接受windows 的執行機制。作為windows 作業系統靈魂的訊息機制也就必然為眾多用不同語言開發的windows作業系統下執行的應用程式所接受。因此,要編寫深入的windows程式,就必須對 windows的執行機制有很好的認識和理解。本文下面將對windows作業系統下的訊息執行機制做較為深入的剖析。
二、windows事件驅動機制
我們當中不少使用vc、delphi等作為開發語言的程式設計師是一步步從dos下的basic、c++中走過來的,而且大多在剛開始學習程式設計時也是先從 dos下的程式設計環境入手的,因此在習慣了dos下的過程驅動形式的順序程式設計方法後,往往在向windows下的開發環境轉型的過程中會對 windows所採取的事件驅動方式感到無法適應。因為dos和windows這兩種作業系統的執行機制是截然不同的,dos下的任何程式都是使用順序的、過程驅動的程式設計方法。這種程式都有乙個明顯的開始、明顯的過程以及乙個明顯的結束,因此通過程式就能直接控制程式事件或過程的全部順序。即使是在處理異常時,處理過程也仍然是順序的、過程驅動的結構。而windows的驅動方式則是事件驅動的,即程式的流程不是由事件的順序來控制,而是由事件的發生來控制,所有的事件是無序的,所為乙個程式設計師,在編寫程式時,並不知道使用者會先按下哪個按紐,也就不知道程式先觸發哪個訊息。因此我們的主要任務就是對正在開發的應用程式要發出的或要接收的訊息進行排序和管理。事件驅動程式設計是密切圍繞訊息的產生與處理而展開的,一條訊息是關於發生的事件的訊息。
三、windows的訊息迴圈
windows訊息機制
一 windows中有乙個系統訊息佇列,對於每乙個正在執行的windows應用程式,系統為其建立乙個 訊息佇列 即應用程式佇列,用來存放該程式可能 建立的各種視窗的訊息。應用程式中含有一段稱作 訊息迴圈 的 用來從訊息佇列中檢索這些訊息並把它們分發到相應的視窗函式中。二 windows為當前執行的每...
windows訊息機制
一 windows中有乙個系統訊息佇列,對於每乙個正在執行的windows應用程式,系統為其建立乙個 訊息佇列 即應用程式佇列,用來存放該程式可能 建立的各種視窗的訊息。應用程式中含有一段稱作 訊息迴圈 的 用來從訊息佇列中檢索這些訊息並把它們分發到相應的視窗函式中。二 windows為當前執行的每...
Windows訊息機制
訊息佇列分為 系統訊息佇列 執行緒訊息佇列 應用程式訊息佇列 系統訊息佇列 這是系統唯一的佇列,輸入裝置 滑鼠 鍵盤等 的驅動程式把使用者的操作轉換成訊息的形式放置到系統佇列中,然後系統會把此訊息轉到目標視窗所在的執行緒訊息佇列中等待處理。執行緒訊息佇列 每個gui 圖形使用者 介面 graphic...