Receive Windows Messages In NonWindowed Control

View Code
interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;

type

  TMsgReceiver = class(TObject)
  private
    fMsgHandlerHWND : HWND;

    WM_MY_UNIQUE_MESSAGE : Cardinal;

    procedure WndMethod(var Msg: TMessage);
  public
    Point : TPoint;

    constructor Create;
    destructor Destroy; override;
  end;

  TClickSendForm = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormMouseDown(Sender: TObject; Button: TMouseButton;  Shift: TShiftState; X, Y: Integer);
    procedure FormDestroy(Sender: TObject);
  private
    WM_MY_UNIQUE_MESSAGE : Cardinal;
    fMsgReceiver: TMsgReceiver;
    function GetMsgReceiver: TMsgReceiver;
    property MsgReceiver : TMsgReceiver read GetMsgReceiver;
  public
    { Public declarations }
  end;

var
  ClickSendForm: TClickSendForm;

implementation

{$R *.dfm}

procedure TClickSendForm.FormCreate(Sender: TObject);
begin

  //instantiate MsgReceiver
  MsgReceiver;

  WM_MY_UNIQUE_MESSAGE := RegisterWindowMessage('MSG_MY_UNIQUE_MESSAGE');
end;

{ TMsgReceiver }

constructor TMsgReceiver.Create;
begin
  inherited Create;

  fMsgHandlerHWND := AllocateHWnd(WndMethod);

  WM_MY_UNIQUE_MESSAGE := RegisterWindowMessage('MSG_MY_UNIQUE_MESSAGE');

end;

destructor TMsgReceiver.Destroy;
begin
  DeallocateHWnd(fMsgHandlerHWND);
  inherited;
end;

procedure TMsgReceiver.WndMethod(var Msg: TMessage);
begin
  if Msg.Msg = WM_MY_UNIQUE_MESSAGE then
  begin
    Point.X := Msg.LParam;
    Point.Y := Msg.WParam;

    //just to receive some "output"
    Windows.Beep(Point.X, Point.Y);
  end
  else
    Msg.Result := DefWindowProc(fMsgHandlerHWND, Msg.Msg, Msg.wParam, Msg.lParam);
end;

procedure TClickSendForm.FormDestroy(Sender: TObject);
begin
  FreeAndNil(fMsgReceiver);
end;

procedure TClickSendForm.FormMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  PostMessage(HWND_BROADCAST, WM_MY_UNIQUE_MESSAGE, x, y);
end;

function TClickSendForm.GetMsgReceiver: TMsgReceiver;
begin
  if fMsgReceiver = nil then fMsgReceiver := TMsgReceiver.Create;
  result := fMsgReceiver;
end;

end.

转载于:https://www.cnblogs.com/Jekhn/archive/2012/04/21/2461508.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值