windows是乙個基於訊息驅動的系統,因此,在很多時候,我們需要截獲一些訊息然後自己進行處理。而vcl系統又有一些特定的訊息。下面對我所了解的delphi環境中截獲訊息進行一些總結。
就個人了解,共有6種方法來截獲/處理訊息。
1. 訊息鉤子(message hook)
特點:可以針對所有有控制代碼的窗體,適用性廣泛。針對的不僅僅是乙個視窗,而是程序所在的所有窗體的訊息。
首先,使用setwindowshookex(wh_callwndproc, @hookproc, 0, getcurrentthreadid);掛接訊息鉤子。當然你也可以根據需要設定其他型別的鉤子。
然後,在hookproc過程中來處理訊息。
function hookproc(ncode: uint; wpar, lpar: longint): longint; stdcall;
begin
...end;
2. 子類化(subclass)
特點:可以針對所有有控制代碼的窗體,適用性廣泛。僅僅能針對某乙個視窗進行訊息截獲。
簡單的說,就是替換視窗過程。使用setwindowlong(ahandle, gwl_wndproc, integer(@newwndproc));
3. 過載(override)視窗處理函式wndproc/defaulthandler等。
特點:僅僅在vcl中可以使用。而且,必須重新生成乙個類。可以截獲該類控制項的所有訊息。
過載父類的視窗處理過程wndproc,然後在裡面處理自己需要的訊息。
tmycontrol = class(tcontrol)
protected
procedure wndproc(var amsg: tmessage); override;
end;
procedure tmycontrol.wndproc(var amsg: tmessage);
begin
..end;
4. 訊息控制代碼(message handler)
特點:僅僅在vcl可用。只能針對一些特殊的訊息。不能截獲所有訊息。
截獲特定訊息,自定義訊息。
tform1 = class(tform)
....
private
procedure wmpaint(var amsg: tmessage); message wm_paint;
.....
end;
procedure tform1.wmpaint(var amsg: tmessage);
begin
...end;
5. rtti/typinfo
特點:僅僅適用於vcl系統。僅僅可以截獲特殊方法(publish method)。
使用delphi的rtti,執行時的型別資訊。替換原來的控制項訊息處理方法。這種方法,只能替換publish出來的屬性。
setmethodprop();
6. 自定義訊息處理函式。
特點:僅僅適用vcl系統。可以截獲所有訊息。
form1.windowproc:= @newmethod;
其中,前兩種不單可以截獲vcl訊息,而且,可以截獲windows標準控制項的訊息。比較通用。
最後一種方法,可以截獲所有vcl訊息。
幾種方法是從一般到特殊,當你深入到一種語言的內部的時候,你會發現其實,達到乙個目的,不止一條路可以走,不同的路有不同的優缺點。需要根據情況擇優選取。
Delphi中的訊息處理
1 windows的訊息驅動體系 在windows系統中,訊息傳遞是實現物件間通訊和控制的主要手段。可以系統都以訊息驅動的方式工作。系統中發生的使用者輸入操作 顯示資訊的改變 系統環境引數變化等所有事件都以系統定義訊息的形式出現在相關的應用程式和視窗。所以程式設計的主要任務就是為這些訊息的處理設計 ...
截獲與管理Windows的訊息
截獲與管理windows的訊息 摘 要 如何用乙個程式截獲管理windows的訊息 關鍵字 windows 訊息 監聽 列表 類 別 系統控制 有時候我們為了多項應用而要管理windows的訊息。我們怎樣才能做到呢?unit testeandoesta inte ce uses sysutils,w...
Delphi的訊息處理
delphi中的訊息 訊息是windows發出的乙個通知,它告訴應用程式某個事件發生了。在delphi中,大多數情況下windows的訊息被封裝在vcl的事件中,我們只需處理相應的vcl事件就可以了,但如果我們需要編寫自己的控制項 截獲或過濾訊息就必須深入研究win32的訊息處理機制。在delphi...