这是别人的一段程序,还有些问题,我没有调试完
unit Setlong;
interface
uses
SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
Forms, Dialogs, Buttons, StdCtrls, ExtCtrls;
const
wTestMessage=WM_USER+200;
type
TInspecterform = class(TForm)
Panel1: TPanel;
Label1: TLabel;
edtn_Targetwindow: TEdit;
spb_Locate: TSpeedButton;
lbl_TargetHwnd: TLabel;
grb_Inspecter: TGroupBox;
Mmo_Inspecter: TMemo;
spb_Setproc: TSpeedButton;
spb_sendTestmessage: TSpeedButton;
spb_Unhook: TSpeedButton;
lbl_WndProcAddress: TLabel;
procedure spb_LocateClick(Sender: TObject);
procedure spb_SetprocClick(Sender: TObject);
procedure spb_sendTestmessageClick(Sender: TObject);
private
{ Private declarations }
procedure Wndproc(var Msg :TMessage);override;
public
{ Public declarations }
end;
var
Inspecterform: TInspecterform;
TargetHwnd :Integer;
TargetWindowproc
![Stick Out Tongue :P :P](https://cdn.jsdelivr.net/joypixels/assets/8.0/png/unicode/64/1f61b.png)
ointer;
implementation
{$R *.DFM}
procedure TInspecterform.Wndproc(var Msg:TMessage);
begin
if Msg.Msg = wTestMessage then
ShowMessage('i got it');
inherited Wndproc(Msg);
end;
function InspecterWndProc(Handle:Hwnd;Msg,Wparam:Word;Lparam:LongInt):LongInt;
begin
{后来,这里我什么都不写,直接把消息传给被监控程序的wndproc,不过还是会报错}
Result := CallWindowproc(TargetWindowProc,TargetHwnd,Msg,Wparam,lparam);
end;
procedure TInspecterform.spb_LocateClick(Sender: TObject);
begin
{TargetHwnd是被监控程序的Hwnd}
TargetHwnd := FindWindow('TmainForm','mainform');
if TargetHwnd =0 then begin
ShowMessage('Can not Find the Target Window');
Exit;
end
else
lbl_TargetHwnd.Caption := 'TargetWindow Handle is : '+IntToHEX(TargetHwnd,4);
end;
procedure TInspecterform.spb_SetprocClick(Sender: TObject);
begin
TargetWindowproc := Pointer(SetWindowLong(TargetHwnd,GWL_WNDPROC,Longint(@InspecterWndProc)));
end;
procedure TInspecterform.spb_sendTestmessageClick(Sender: TObject);
begin
PostMessage(TargetHwnd,wTestMessage,0,0);
end;
end.