D5DG中的例子,你自己看吧:unit Main;interfaceuses SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;type TMainForm = class(TForm) SendBtn: TButton; PostBtn: TButton; procedure SendBtnClick(Sender: TObject); procedure PostBtnClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); private OldWndProc: Pointer; WndProcPtr: Pointer; procedure WndMethod(var Msg: TMessage); procedure HandleAppMessage(var Msg: TMsg; var Handled: Boolean); end;var MainForm: TMainForm;implementation{$R *.DFM}uses ScWndPrc; procedure TMainForm.HandleAppMessage(var Msg: TMsg; var Handled: Boolean); { OnMessage handler for Application object. } begin if Msg.Message = DDGM_FOOMSG then { if it's the user-defined message, then alert the user. } ShowMessage(Format('Message seen by OnMessage! Value is: $%x', [Msg.Message])); end;procedure TMainForm.WndMethod(var Msg: TMessage); begin if Msg.Msg = DDGM_FOOMSG then { if it's the user-defined message, then alert the user. } ShowMessage(Format('Message seen by WndMethod! Value is: $%x', [Msg.Msg])); with Msg do { Pass message on to old window procedure. } Result := CallWindowProc(OldWndProc, Application.Handle, Msg, wParam, lParam); end;procedure TMainForm.SendBtnClick(Sender: TObject); begin SendMessage(Application.Handle, DDGM_FOOMSG, 0, 0); end;procedure TMainForm.PostBtnClick(Sender: TObject); begin PostMessage(Application.Handle, DDGM_FOOMSG, 0, 0); end;procedure TMainForm.FormCreate(Sender: TObject); begin Application.OnMessage := HandleAppMessage; // set OnMessage handler WndProcPtr := MakeObjectInstance(WndMethod); // make window proc { Set window procedure of application window. } OldWndProc := Pointer(SetWindowLong(Application.Handle, GWL_WNDPROC, Integer(WndProcPtr))); end;procedure TMainForm.FormDestroy(Sender: TObject); begin { Restore old window procedure for Application window } SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(OldWndProc)); { Free our user-created window procedure } FreeObjectInstance(WndProcPtr); end;end.unit Scwndprc;interfaceuses Forms, Messages;const DDGM_FOOMSG = WM_USER;implementationuses Windows, SysUtils, Dialogs;var WProc: Pointer;function NewWndProc(Handle: hWnd; Msg, wParam, lParam: Longint): Longint; stdcall; { This is a Win32 API-level window procedure. It handles the messages } { received by the Application window. } begin if Msg = DDGM_FOOMSG then { If it's our user-defined message, then alert the user. } ShowMessage(Format('Message seen by WndProc! Value is: $%x', [Msg])); { Pass message on to old window procedure } Result := CallWindowProc(WProc, Handle, Msg, wParam, lParam); end;initialization { Set window procedure of Application window. } WProc := Pointer(SetWindowLong(Application.Handle, gwl_WndProc, Integer(@NewWndProc))); end.
my god这样做还不如重写一个button, 用message阿 或者直接override WinProc
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, StdCtrls;type
TMainForm = class(TForm)
SendBtn: TButton;
PostBtn: TButton;
procedure SendBtnClick(Sender: TObject);
procedure PostBtnClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
OldWndProc: Pointer;
WndProcPtr: Pointer;
procedure WndMethod(var Msg: TMessage);
procedure HandleAppMessage(var Msg: TMsg; var Handled: Boolean);
end;var
MainForm: TMainForm;implementation{$R *.DFM}uses ScWndPrc;
procedure TMainForm.HandleAppMessage(var Msg: TMsg; var Handled: Boolean);
{ OnMessage handler for Application object. }
begin
if Msg.Message = DDGM_FOOMSG then
{ if it's the user-defined message, then alert the user. }
ShowMessage(Format('Message seen by OnMessage! Value is: $%x',
[Msg.Message]));
end;procedure TMainForm.WndMethod(var Msg: TMessage);
begin
if Msg.Msg = DDGM_FOOMSG then
{ if it's the user-defined message, then alert the user. }
ShowMessage(Format('Message seen by WndMethod! Value is: $%x', [Msg.Msg]));
with Msg do
{ Pass message on to old window procedure. }
Result := CallWindowProc(OldWndProc, Application.Handle, Msg, wParam,
lParam);
end;procedure TMainForm.SendBtnClick(Sender: TObject);
begin
SendMessage(Application.Handle, DDGM_FOOMSG, 0, 0);
end;procedure TMainForm.PostBtnClick(Sender: TObject);
begin
PostMessage(Application.Handle, DDGM_FOOMSG, 0, 0);
end;procedure TMainForm.FormCreate(Sender: TObject);
begin
Application.OnMessage := HandleAppMessage; // set OnMessage handler
WndProcPtr := MakeObjectInstance(WndMethod); // make window proc
{ Set window procedure of application window. }
OldWndProc := Pointer(SetWindowLong(Application.Handle, GWL_WNDPROC,
Integer(WndProcPtr)));
end;procedure TMainForm.FormDestroy(Sender: TObject);
begin
{ Restore old window procedure for Application window }
SetWindowLong(Application.Handle, GWL_WNDPROC, Longint(OldWndProc));
{ Free our user-created window procedure }
FreeObjectInstance(WndProcPtr);
end;end.unit Scwndprc;interfaceuses Forms, Messages;const
DDGM_FOOMSG = WM_USER;implementationuses Windows, SysUtils, Dialogs;var
WProc: Pointer;function NewWndProc(Handle: hWnd; Msg, wParam, lParam: Longint): Longint;
stdcall;
{ This is a Win32 API-level window procedure. It handles the messages }
{ received by the Application window. }
begin
if Msg = DDGM_FOOMSG then
{ If it's our user-defined message, then alert the user. }
ShowMessage(Format('Message seen by WndProc! Value is: $%x', [Msg]));
{ Pass message on to old window procedure }
Result := CallWindowProc(WProc, Handle, Msg, wParam, lParam);
end;initialization
{ Set window procedure of Application window. }
WProc := Pointer(SetWindowLong(Application.Handle, gwl_WndProc,
Integer(@NewWndProc)));
end.