PostMessage 只是把消息放入队列,不管其他程序是否处理都返回,然后继续执行 ;
而 SendMessage 必须等待其他程序处理消息后才返回,继续执行。
PostMessage 的返回值表示 PostMessage 函数执行是否正确 ;
而 SendMessage 的返回值表示其他程序处理消息后的返回值。
使用这两个发送消息函数的最重要的是要看你的程序是否要对消息的滞后性关注否 ,PostMessage 会造成消息的滞后性 , 而 SendMessage 则不会 , 但如果 SendMessage 消息处理失败 , 则会造成程序停止 !
为了让大家能清楚的看到他们的效果,可以用下面的代码进行测试:
而 SendMessage 必须等待其他程序处理消息后才返回,继续执行。
PostMessage 的返回值表示 PostMessage 函数执行是否正确 ;
而 SendMessage 的返回值表示其他程序处理消息后的返回值。
使用这两个发送消息函数的最重要的是要看你的程序是否要对消息的滞后性关注否 ,PostMessage 会造成消息的滞后性 , 而 SendMessage 则不会 , 但如果 SendMessage 消息处理失败 , 则会造成程序停止 !
为了让大家能清楚的看到他们的效果,可以用下面的代码进行测试:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class (TForm)
mmo1: TMemo;
btn2: TButton;
btn3: TButton;
procedure btn2Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
private
{ Private declarations }
procedure testPostMessage;
procedure testSendMessage;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses uFile;
{$R *.dfm}
var
f: TFile;
procedure TForm1.btn2Click(Sender: TObject);
var
i: Integer;
begin
testPostMessage;
for i : = 0 to 5000 do
begin
mmo1.Lines.Add(IntToStr(i) + ' ====== ' );
end;
end;
procedure TForm1.btn3Click(Sender: TObject);
var
i: Integer;
begin
testSendMessage;
for i : = 0 to 5000 do
begin
mmo1.Lines.Add(IntToStr(i) + ' ====== ' );
end;
end;
procedure TForm1.testPostMessage;
var
i: Integer;
begin
PostMessage(f.Handle, WM_TEST, 0 , 0 );
for i : = 0 to 5000 do
begin
mmo1.Lines.Add(IntToStr(i))
end;
end;
procedure TForm1.testSendMessage;
var
i: Integer;
begin
SendMessage(f.Handle, WM_TEST, 0 , 0 );
for i : = 0 to 5000 do
begin
mmo1.Lines.Add(IntToStr(i))
end;
end;
initialization
if f = nil then
f : = TFile.Create;
finalization
if f <> nil then
FreeAndNil(f);;
end.
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class (TForm)
mmo1: TMemo;
btn2: TButton;
btn3: TButton;
procedure btn2Click(Sender: TObject);
procedure btn3Click(Sender: TObject);
private
{ Private declarations }
procedure testPostMessage;
procedure testSendMessage;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses uFile;
{$R *.dfm}
var
f: TFile;
procedure TForm1.btn2Click(Sender: TObject);
var
i: Integer;
begin
testPostMessage;
for i : = 0 to 5000 do
begin
mmo1.Lines.Add(IntToStr(i) + ' ====== ' );
end;
end;
procedure TForm1.btn3Click(Sender: TObject);
var
i: Integer;
begin
testSendMessage;
for i : = 0 to 5000 do
begin
mmo1.Lines.Add(IntToStr(i) + ' ====== ' );
end;
end;
procedure TForm1.testPostMessage;
var
i: Integer;
begin
PostMessage(f.Handle, WM_TEST, 0 , 0 );
for i : = 0 to 5000 do
begin
mmo1.Lines.Add(IntToStr(i))
end;
end;
procedure TForm1.testSendMessage;
var
i: Integer;
begin
SendMessage(f.Handle, WM_TEST, 0 , 0 );
for i : = 0 to 5000 do
begin
mmo1.Lines.Add(IntToStr(i))
end;
end;
initialization
if f = nil then
f : = TFile.Create;
finalization
if f <> nil then
FreeAndNil(f);;
end.
unit uFile;
interface
uses
Classes, Windows, Forms, Messages;
const
WM_TEST = WM_USER + 1 ;
type
TFile = class
private
FHandle: HWND;
protected
procedure WndProc(var Msg: TMessage);
public
procedure AfterConstruction; override;
procedure BeforeDestruction; override;
property Handle: HWND read FHandle;
end;
implementation
{ TFile }
procedure TFile.AfterConstruction;
begin
inherited;
FHandle : = AllocateHWnd(WndProc);
end;
procedure TFile.BeforeDestruction;
begin
inherited;
DeallocateHWnd(FHandle);
end;
procedure TFile.WndProc(var Msg: TMessage);
begin
if msg.Msg = WM_TEST then
begin
// 消息处理内容
Application.MessageBox( ' WM_TEST ' , ' WM_TEST ' , 0 );
end;
windows.DefWindowProc(FHandle, Msg.Msg, Msg.wParam, Msg.lParam);
end;
end.
interface
uses
Classes, Windows, Forms, Messages;
const
WM_TEST = WM_USER + 1 ;
type
TFile = class
private
FHandle: HWND;
protected
procedure WndProc(var Msg: TMessage);
public
procedure AfterConstruction; override;
procedure BeforeDestruction; override;
property Handle: HWND read FHandle;
end;
implementation
{ TFile }
procedure TFile.AfterConstruction;
begin
inherited;
FHandle : = AllocateHWnd(WndProc);
end;
procedure TFile.BeforeDestruction;
begin
inherited;
DeallocateHWnd(FHandle);
end;
procedure TFile.WndProc(var Msg: TMessage);
begin
if msg.Msg = WM_TEST then
begin
// 消息处理内容
Application.MessageBox( ' WM_TEST ' , ' WM_TEST ' , 0 );
end;
windows.DefWindowProc(FHandle, Msg.Msg, Msg.wParam, Msg.lParam);
end;
end.