標籤:建立 handle any 處理 else sha proc oca 核心
在delphi中,有時候我們希望對象可以接收windows訊息,怎麼辦呢?因為要接收windows訊息起碼要有windows Handle,難道要建立的一個可見視窗?那樣似乎太差強人意了。delphi提供了一個函數Classes.AllocateHWnd。分析AllocateHWND發現delphi CreateWindowEx一個尺寸為0的視窗,視窗是產生了,Handle也有了,但視窗的訊息要處理吧,否則怎麼說讓對象接收Windows訊息呢,但我們都知道類函數和Windows訊息處理函數是不一樣的,類函數的地址應該是Self+函數的位移。這個delphi也幫我們處理好了,在AllocateHWnd內部將我們傳入的對象函數通過MakeObjectInstance轉換為普通函數,然後我們就可以在對象內部處理Windows訊息了。
簡寫代碼如下:
TMyHandleWinMessage = class
private
FWinHandle: HWND;
procedure WndProc(var Msg: TMessage);
public
constructor Create;
destructor Destroy; override;
end;
Create 實現:
FWinHandle = Classes.AllocateHWnd(WndProc);
Destroy實現:
if FWinHandle <> 0 then Classes.DeallocateHWnd(FWinHandle); // 必須釋放系統核心對象
WndProc實現:
在這裡處理你感興趣的訊息,否則交給Windows處理。
With Msg do
if Msg = XXX then // 你打算處理的訊息
begin
//
end
else
Result := DefWindowProc(FWinHandle, Msg, wParam, lParam);
http://blog.csdn.net/shandiantianying/article/details/9786425
Delphi使用普通類對象建立接受window訊息(使用Classes.AllocateHWnd為對象建立一個尺寸為0的視窗,從而有了Handle)good