Perform()/SendMessage()


Perform()
    VCL的Perform()方法适用于所有的TControl派生对象。Perform()可以向任何一个窗件或控件发送消息,只需要知道窗体或控件的实例。Perform()需要传递3个参数:消息标识符,wParam和lParam。
Perform()是这样声明的:
function Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;
Perform
function TControl.Perform(Msg: Cardinal; WParam, LParam: Longint): Longint;
var
  Message: TMessage;
begin
  Message.Msg :
= Msg;
  Message.WParam :
= WParam;
  Message.LParam :
= LParam;
  Message.Result :
= 0;
  
if Self <> nil then WindowProc(Message);
  Result :
= Message.Result;
end;
Perform()把3个参数组装成TMessage记录,然后调用WindowProc()方法把消息传递给Windows的消息系统。
要给一个窗件或控件发送一个消息,可以参照下面的代码:
RetVal = ControlName.Perform(MessagID, wParam,lParam);
调用了Perform()后,它要等消息得到处理后才返回。

SendMessage()和PostMessage()
是Windows有两个API函数。
function SendMessage; external user32 name 'SendMessageA';
function SendMessageA(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): LRESULT; stdcall;
function PostMessage; external user32 name 'PostMessageA';
function PostMessage(hWnd: HWND; Msg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
可以实现这一点:SendMessage()和PostMessage().这两个函数几乎是一样的,它们的区别是:
SendMessage()跟Perform一样是同步调用,消息直接发往目的窗口,等消息被处理后才返回。
Postmessage()是异步调用,把消息发送到消息队伍后立即返回。
其次,他们的返回值也是不一样的。Postmessage()是返回值是一个Bool值。



Code
  procedure WndProc(var msg:TMessage);override;
    
procedure btnPostMsgClick(Sender: TObject);
    
procedure btnSendMsgClick(Sender: TObject);
    
procedure btnPerformClick(Sender: TObject);
    
procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);

implementation

{$R *.dfm}

procedure TForm1.WndProc(var msg: TMessage);
begin
 inherited;
 
if msg.Msg=WM_KEYDOWN then
  Memo1.Lines.Add(
'WndProc is handled!');
  
end;

procedure TForm1.btnPerformClick(Sender: TObject);
var
  rst:Integer;
begin
  Memo1.Lines.Add(
'---------------------');
  rst:
=Form1.Perform(WM_KEYDOWN,0,0);
 Memo1.Lines.Add(
'Perform is handled');
 Memo1.Lines.Add(PChar(
'Result is:'+inttostr(rst)));
end;

procedure TForm1.btnPostMsgClick(Sender: TObject);
var
  rst:BOOL;
begin
  Memo1.Lines.Add(
'---------------------');
  rst:
=PostMessage(self.Handle,WM_KEYDOWN,0,0);
  Memo1.Lines.Add(
'PostMessage is handled!');
  Memo1.Lines.Add(PChar(
'Result is:'+booltostr(rst)));
end;

procedure TForm1.btnSendMsgClick(Sender: TObject);
var
  rst:Integer;
begin
   Memo1.Lines.Add(
'---------------------');
   SendMessage(self.Handle,WM_KEYDOWN,
0,0);
   Memo1.Lines.Add(
'SendMessage is handled!');
    Memo1.Lines.Add(PChar(
'Result is:'+inttostr(rst)));
end;



procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  Memo1.Lines.Add(
'Had Called Tform1.formkeyDown!')
end;

end.

转载于:https://www.cnblogs.com/samsonleung/archive/2008/07/07/1237424.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值