DELPHI下的WINDOWS訊息傳遞機制

2021-04-07 13:34:48 字數 1665 閱讀 5979

blog開了很久,專業的東西一點沒寫,今天既然已經坐下了,就寫點東西吧,也算調整調整心緒!

開發基於windows平台的應用程式時,了解windows訊息系統組成是非常必要的。

訊息本身是作為乙個記錄傳遞給應用程式的,記錄中包含訊息的型別以及其它的資訊!這個記錄型別叫做tmsg,它在windows單元中宣告,這裡就不一一枚舉(偶打字很辛苦的:p)

在win32中預定義的一些訊息常量往往是以wm開頭,以代表某一特定的訊息。delphi的message單元中定義了所有windows訊息,如果有興趣可以自己開啟message單元研究一下!

windows的訊息系統由3部分組成:(1)訊息佇列,windows能夠為所有的應用程式維護乙個訊息佇列,應用程式必須從訊息佇列中獲取訊息,然後分派給某個視窗。(2)訊息迴圈,通過這個迴圈機制,應用程式從訊息佇列中檢索訊息,再把它分派給適當的視窗,依次進行。(3)視窗過程,每個視窗都有乙個視窗過程,以接收windows傳遞給視窗的訊息,視窗過程的任務就是要獲取訊息並響應它(視窗過程是乙個**函式,處理完乙個訊息後,通常要給windows乙個返回值)。

從訊息的產生到訊息被乙個視窗響應,這其中要經歷以下幾個步驟:(1)系統中發生了某個事件。(2)windows把這個事件翻譯成訊息,然後把它放在訊息佇列中。(3)應用程式從訊息佇列中接收這個訊息,並把它存放在tmsg記錄中。(4)應用程式把訊息傳遞給乙個適當的視窗過程。(5)視窗過程響應這個訊息並進行處理。

下面說說delphi的vcl訊息系統處理原理:

wndproc是tcontrol類中的乙個虛擬方法,這意味著它可以被覆蓋,提供自定義的訊息處理例程(事實上,tcontrol構件中就是利用它來過濾並處理所有的滑鼠訊息(從wm_mousefirst到wm_mouselast)的)。wndproc呼叫dispatch方法進行訊息分配,具體**可以檢視tcontrol類wndproc的**實現。

dispatch方法是在tobject根類中定義的,傳遞給它的引數必須是乙個記錄型別,這個記錄中的第乙個點必須是個cardinal型別的字段。dispatch方法根據訊息號碼呼叫元件的最後繼承類中處理此訊息的控制代碼方法。如果此元件和它的祖先類中都沒有對應此訊息的處理控制代碼,dispatch方法便會呼叫defaulthandler方法,dispatch方法是定義於tobject類中的虛擬方法,它只是簡單的返回而不對訊息做任何處理。我們可以對此虛擬方法的過載,在子類中實現對訊息的預設處理(oh……my god,怎麼掉線了~~)。

這就是delphi對windows訊息的處理流程!

傳送訊息:

delphi主要通過三種方式傳送訊息。perform(),使用於所有的tcontrol派生物件。sendmessage()和postmessage()。這些想必都比較熟悉,不再多說了!如果需要跨程序傳送訊息,就要用到registerwindowmessage(),它能夠確保每個應用程式使用一致的訊息序號。具體使用方法可以參考幫助,很簡單的!twincontrol派生的物件可以呼叫broadcast()向它的子元件廣播乙個訊息。當需要向一組元件傳送相同的訊息時,便可以使用這種技術!如果要用sendmessage()或postmessage()實現廣播訊息,只需要把第乙個引數——目標物件控制代碼——設定為hwnd_broadcast就可以,它代表向所有應用的主視窗傳送訊息!

訊息過濾:delphi訊息過濾一般有3種方法,過載構件繼承的虛方法wndproc;針對某訊息編寫訊息處理控制代碼;過載構件繼承的虛方法defaulthandler。其中第二中方法比較常用!

Delphi下深入Windows核心程式設計

目錄 第1章 dll與資料共享 1.1 關於dll 1.1.1 dll的結構 1.1.2 dll資料作用範圍 1.2 記憶體映像 1.2.1 建立映像檔案 1.2.2 開啟映像檔案 1.2.3 對映到本程序中 1.2.4 關閉記憶體對映 1.2.5 兩個exe檔案共享記憶體資料塊 1.2.6 兩個d...

Delphi原生Windows程式

使用windows api編寫原生windows程式 program project3 uses winapi.windows,winapi.messages,system.sysutils const function windowproc window hwnd amessage uint wp...

Delphi開發Windows服務程式

開發步驟 2 現在乙個服務程式的框架已經搭起來了 開啟service1視窗,有幾個屬性說明一下 allowpause 是否允許暫停 allowstop 是否允許停止 dependencies 設定服務的依存關係,服務的啟動是否依賴於某個服務或者組 displayname 在 服務 視窗顯示的名稱 i...