一、什么是消息?
消息是windows對應用程序發送的有關‘發生了某種事件’的通知。例如點擊鼠標,調整窗口大小或鍵盤上按下一個鍵,都會引起windows發送一條消息到應用程序中去,去通知應用程序發生了什么。
Windows以record的形式發送消息給應用程序。記錄中包括事件的類型以及附加的特定信息。Windows發送給應用程序的記錄類型是TMsg,定義在windows.pas單元中,定義如下
- { Message structure }
- PMsg = ^TMsg;
- tagMSG = packed record
- hwnd: HWND;
- message: UINT;
- wParam: WPARAM;
- lParam: LPARAM;
- time: DWORD;
- pt: TPoint;
- end;
- {$EXTERNALSYM tagMSG}
- TMsg = tagMSG;
- MSG= tagMSG;
- {$EXTERNALSYM MSG}
消息字段記錄說明:
Hwnd:32位windows句柄,指向消息要發往的窗口,這個窗口可以是幾乎所有的屏幕對象,因為window對大多數可是對象都維護了一個窗口句柄。
Message:代表某種消息的常量值,這些常量可以是在windows.pas中預定義的標准windows消息,也可以是用戶自定義的消息。
Wparam:這個字段常常包含和消息關聯的常量值,也可以包含一個窗口句柄或者消息關聯的某個窗口或控件的ID值。
Lparam:這個字段經常容納一個對內存數據的索引或指針,由於wparam和lparam都是32位大小,我們可以進行強制類型轉換。
WM開頭的通常是指WindowsMessage.
二、常用windows消息:
wm_active:窗口被激活
wm_char按下某個鍵發送wm_keydown和wm_keyup消息
wm_close窗口將要關閉
wm_keydown用戶正在按下鍵盤上的一個鍵
wm_keyup:用戶已經釋放按下的鍵
wm_lbuttondown用戶按下鼠標左鍵
wm_mousemove用戶正在移動鼠標
wm_paint必須重繪窗口區域
wm_timer發生了一個計時器事件
wm_quit:發送終止程序請求
三、windows消息系統的工作方式
三個部分:消息隊列、消息循環、窗口過程。
消息隊列:Windows為每個應用程序維護一個消息隊列,windows應用程序必須從這個隊列中取得消息,並且把得到的消息分派到合適的窗口。
消息循環:windows程序從應用程序隊列中取得一條消息,分派到適合的窗口中,然后再取得下一條消息,再分發到適合的窗口中,如此循環。這種消息機制就是消息循環。
窗口過程:應用程序中的每個窗口都有一個窗口過程,它接受消息循環中傳入的每條消息,。窗口過程的任務是接受各個窗口消息並且對此做相應的回應。窗口過程是所謂的回調函數,在處理完畢一條消息之后,窗口過程通常要給windows一個返回值。
四、發送自己的消息:
我們需要在應用程序窗口和控件之間發送消息。Delphi提供了以下幾種方法:
Perform()方法:VCL為所有的TContol派生類提供了perform()方法,可以發送消息給任何已知對象實例的對象或控件對象。Perform有三個參數:消息,對應的lparam和wparam。如下:
- function Tcontrol.perform(Msg :cardinal;wparam,lparam:longint):longint;
要發送一條消息給一個窗體或控件,使用下面的格式:
- Retval:=controlname.perform(messageid,lparam,wparam);
Perform是同步調用的,因此直到消息被處理完畢,才能得到返回值。Perform()方法把它的參數組合成一個TMessage記錄,然后調用該對象的Dispatch方法去發送這條消息,繞開了windowsAPI消息系統。
Sendmessage()和postmessage()API函數:
Sendmessage和perform()類似,是同步調用的。消息直接發往目的窗口,該消息被處理完畢才返回;postmessage是異步調用的,發送消息給windows隊列,然后立即返回。
通知消息:窗口的子控件發生事件,如果需要通知父窗口,就發送此消息。只發生在windows標准控件中如button、 listbox 、combox和通用控件如tree view、 list view等。
http://blog.csdn.net/sushengmiyan/article/details/7454919