unit Unit1;
interface
uses
System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
FMX.Types, FMX.Controls, FMX.Forms, FMX.Dialogs,Messages,FMX.Platform.Win,Winapi.Windows;
const
WM_FrmMsg=WM_USER+106;
type
TForm1 = class(TForm)
Button1: TButton;
procedure WMFrmMsg (var MSG:TMessage);message WM_FrmMsg;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FHwnd: HWND;
FOldWndProc: LONG;
public
{ Public declarations }
function WndProc(Hwnd: HWND; Msg:UINT; wParam: WPARAM; lParam: LPARAM): LRESULT;
end;
var
Form1: TForm1;
implementation
{$R *.fmx}
function WindowProc(Hwnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
begin
Result := Form1.WndProc(Hwnd, Msg, wParam, lParam);
end;
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(FmxHandleToHWND(Handle),WM_FrmMsg,0,0);
end;
procedure TForm1.WMFrmMsg(var MSG: TMessage);
begin
ShowMessage('ok');
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
FHwnd := FmxHandleToHwnd(Handle);
FOldWndProc := GetWindowLongPtr(FHwnd, GWL_WNDPROC);
SetWindowLongPtr(FHwnd, GWL_WNDPROC, NativeInt(@WindowProc));
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
SetWindowLongPtr(FHwnd, GWL_WNDPROC, FOldWndProc);
end;
function TForm1.WndProc(Hwnd: HWND; Msg: UINT; wParam: WPARAM;
lParam: LPARAM): LRESULT;
var
msgrec: TMessage;
begin
Result := 0;
msgrec.Msg := Msg;
msgrec.WParam := wParam;
msgrec.LParam := lParam;
case Msg of
WM_FrmMsg: WMFrmMsg(msgrec);
else
Result := CallWindowProc(Ptr(FOldWndProc), Hwnd, Msg, wParam, lParam);
end;
end;
end.