Delphi 사용자 정의 창 프로세스 WinProc
4793 단어 Delphi
unit ScWndProc;
interface
uses Forms, Messages;
const
DDGM_FOOMSG = WM_USER; //
implementation
uses windows,sysutils,Dialogs;
var
WProc : Pointer;
function NewWndProc(handle: hWnd; msg,wParam,lParam: LongInt): LongInt ;
stdcall;
begin
if msg = DDGM_FOOMSG then
ShowMessage(Format(' $%x',[msg]));
result := CallWindowProc(WProc,handle, msg,wParam,lParam);
end;
initialization
WProc := Pointer(SetWindowLong(application.Handle,GWL_WNDPROC
,integer(@NewWndProc)));
end.
//메시지 SendMessage(application.Handle,DDGM FOOMSG,0,0)를 보냅니다.
unit UnitSendVsPost;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TFrmSendPostMsg = class(TForm)
btnSendMessage: TButton;
btnPostMessage: TButton;
procedure btnSendMessageClick(Sender: TObject);
procedure btnPostMessageClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
OldWndProc : Pointer;
WndProcPtr : Pointer;
procedure WndMethod(var msg: TMessage);
procedure HandleAppMessage(var msg : TMsg; var handled : boolean);
public
{ Public declarations }
end;
var
FrmSendPostMsg: TFrmSendPostMsg;
implementation
{$R *.dfm}
uses
ScWndProc;
procedure TFrmSendPostMsg.WndMethod(var msg: TMessage);
begin
if msg.Msg = DDGM_FOOMSG then
begin
ShowMessage(Format('Message seen by WndMethod! value is: $%x',[msg.Msg]));
with msg do
result := CallWindowProc(OldWndProc,Application.Handle,msg,WParam,LParam);
end;
end;
procedure TFrmSendPostMsg.HandleAppMessage(var msg : TMsg; var handled : boolean);
begin
if msg.message = DDGM_FOOMSG then
begin
ShowMessage(Format('Message seen by OnMessage! value is: $%x',[msg.message]));
//handled := true;
end;
end;
procedure TFrmSendPostMsg.btnSendMessageClick(Sender: TObject);
begin
//
sendmessage(application.Handle,DDGM_FOOMSG,0,0);
end;
procedure TFrmSendPostMsg.btnPostMessageClick(Sender: TObject);
begin
postmessage(application.Handle,DDGM_FOOMSG,0,0);
end;
procedure TFrmSendPostMsg.FormCreate(Sender: TObject);
begin
application.OnMessage := HandleAppMessage; // set OnMessage handler
WndProcPtr := MakeObjectInstance(WndMethod);
OldWndProc := Pointer(SetWindowLong(Application.Handle,GWL_WNDPROC,Integer(WndProcPtr)));
end;
procedure TFrmSendPostMsg.FormDestroy(Sender: TObject);
begin
SetWindowLong(Application.Handle,GWL_WNDPROC,LongInt(OldWndProc));
FreeObjectInstance(WndProcPtr);
end;
end.
unit UnitHook;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TFrmHookWin = class(TForm)
lstMsg: TListBox;
btnSendMsg: TButton;
procedure btnSendMsgClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
function AppWindowHook(var message: TMessage): boolean;
public
{ Public declarations }
end;
var
FrmHookWin: TFrmHookWin;
implementation
{$R *.dfm}
function TFrmHookWin.AppWindowHook(var message: TMessage): boolean;
const
strLog = 'MsgID: $%x, WParam: $%x, LParam: $%x';
begin
Result := true;
with message do
lstMsg.Items.Add(Format(strLog,[Msg,WParam,LParam]));
end;
procedure TFrmHookWin.btnSendMsgClick(Sender: TObject);
begin
SendMessage(application.Handle,WM_NULL,0,0);
end;
procedure TFrmHookWin.FormCreate(Sender: TObject);
begin
Application.HookMainWindow(self.AppWindowHook);
end;
procedure TFrmHookWin.FormDestroy(Sender: TObject);
begin
application.UnhookMainWindow(self.AppWindowHook);
end;
end.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[Delphi] TStringBuilder그리고 꼭 사용해야만 할까? 그림처럼 Heap 영역에 "Hello" 공간을 생성하고 포인팅을 한다. "Hello World" 공간을 새로 생성한 후 포인팅을 하게 된다. 결국 "Hello" 라는 String 객체가 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.