讓自己寫的Delphi控件具備接收windows消息的能力

原理:該效果的實現主要是使用AllocateHwnd函數(可以查閱Delphi的幫助)生成一個非可視的窗口來響應消息,該函數的返回值既是非可視窗口的句柄。然後就可以在你的類中響應Windows的消息了。該函數只有一個參數就是要創建的非可視窗口的WinProc函數(就是處理該窗口消息的函數),當然你也可以在這個函數中處理你要處理的消息了。最後在類銷燬時一定要DeallocateHWnd這個非可視窗口。

這些在翻看Delphi ScktComp單元的Socket類時得到。原因在於好奇這些類如何能得到Windows發給它們的關於Socket的消息。

以下是從TCustomWinSocket類摘出來源碼(可以響應消息): 


unit uClass;

interface

uses Messages, Classes, Dialogs;

const
WM_MYTEST = WM_USER + $1000; // 測試用

type
TMyClass = class
private
FHandle: THandle;
procedure WinProc(var Msg: TMessage);
procedure WMMyTest(var Msg: TMessage); message WM_MYTEST; // 測試用
public 
constructor Create;
destructor Destroy; override;
property Handle: THandle read FHandle;
end;

implementation

{ TMyClass }

constructor TMyClass.Create;
begin
if FHandle = 0 then
FHandle := AllocateHwnd(WinProc);
end;

destructor TMyClass.Destroy;
begin
if FHandle <> 0 then
DeallocateHWnd(FHandle);
end;

procedure TMyClass.WinProc(var Msg: TMessage);
begin
try
//if Msg.Msg = WM_MYTEST then
// ShowMessage('I''m the first get the message "WM_MYTEST"');
Dispatch(Msg);
except
if Assigned(ApplicationHandleException) then
ApplicationHandleException(Self);
end;
end;

procedure TMyClass.WMMyTest(var Msg: TMessage);
begin
ShowMessage('Test OK!' + #10
+ 'I''m coming from Class "TMyClass" with message "WM_MYTEST"!');
end;

end.

後記:這樣,這個類就具有了一個句柄,發個消息WM_MYTEST看看。還能執行。呵呵,以後再寫需要響應消息的類的時候,直接繼承它就可以了,記得要把 WMMyTest過程刪掉,它只是一個測試。

測試:
var 
mc: TMyClass;
begin
mc := TMyClass.Create; 
PostMessage(mc.Handle, WM_MYTEST, 0, 0); 
end;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章