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. 

posted on 2011-12-27 15:53  万一  阅读(1114)  评论(0)    收藏  举报