让自己写的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;

Creating Windows CreateMDIWindow CreateWindow CreateWindowEx RegisterClass RegisterClassEx UnregisterClass Message Processing BroadcastSystemMessage CallNextHookEx CallWindowProc DefFrameProc DefMDIChildProc DefWindowProc DispatchMessage GetMessage GetMessageExtraInfo GetMessagePos GetMessageTime GetQueueStatus InSendMessage PeekMessage PostMessage PostQuitMessage PostThreadMessage RegisterWindowMessage ReplyMessage SendMessage SendMessageCallback SendMessageTimeout SendNotifyMessage SetMessageExtraInfo SetWindowsHookEx TranslateMessage UnhookWindowsHookEx WaitMessage Window Information AnyPopup ChildWindowFromPoint ChildWindowFromPointEx EnableWindow EnumChildWindows EnumPropsEx EnumThreadWindows EnumWindows FindWindow FindWindowEx GetClassInfoEx GetClassLong GetClassName GetClientRect GetDesktopWindow GetFocus GetForegroundWindow GetNextWindow GetParent GetProp GetTopWindow GetWindow GetWindowLong GetWindowRect GetWindowText GetWindowTextLength IsChild IsIconic IsWindow IsWindowEnabled IsWindowUnicode IsWindowVisible IsZoomed RemoveProp SetActiveWindow SetClassLong SetFocus SetForegroundWindow SetParent SetProp SetWindowLong SetWindowText WindowFromPoint Processes and Threads CreateEvent CreateMutex CreateProcess CreateSemaphore CreateThread DeleteCriticalSection DuplicateHandle EnterCriticalSection ExitProcess ExitThread GetCurrentProcess GetCurrentProcessId GetCurrentThread GetCurrentThreadId GetExitCodeProcess GetExitCodeThread GetPriorityClass GetThreadPriority GetWindowThreadProcessId InitializeCriticalSection InterlockedDecrement InterlockedExchange InterlockedIncrement LeaveCriticalSection OpenEvent OpenMutex OpenProcess OpenSemaphore PulseEvent ReleaseMutex ReleaseSemaphore ResetEvent ResumeThread SetEvent SetPr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值