`
- 浏览:
30512 次
- 性别:
- 来自:
北京
-
PostMessage和SendMessage区别
PostMessage 只是把消息放入队列,不管其他程序是否处理都返回,然后继续执行 ;
而 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.
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.
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
PostMessage和SendMessage的区别
在C#中SendMessage和PostMessage的参数传递 在C#中可以使用Window API提供的SendMessage和PostMessage来传递参数。两者的区别简单介绍下:返回值的不同,我们先看一下 MSDN 里的声明: LRESULT SendMessage( HWND ...
SendMessage与PostMessage区别,区别演示示例
关于FindWindow PostMessage SendMessage PeekMessage 的两个例子
资源包含两个源程序,里面是借用MFC的消息通信实现简单的两个进程间通信,嗯主要是通过SendMessage或PostMessage,功能实现简单便捷。
PostMessage和SendMessage 简单程序
2.两个对话框CMessageDlg和ConeDlg; 3.CMessageDlg为父窗口,ConeDlg为子窗口; 4.父窗口上有一个按钮用于弹出子窗口,子窗口也有一个按钮用来触发事件; 5.子窗口的按钮触发事件后,发送消息给父窗口,然后在...
主要示例在C#中的SendMessage,PostMessage,包含两个示例,一个资料文档,希望受用。 在C#中 API 消息处理 SendMessage PostMessage 进程通信 发消息 实例 文档资料
资源包含两个源程序,里面是借用MFC的消息通信实现简单的两个进程间通信,嗯主要是通过SendMessage或PostMessage,功能实现简单便捷。该资源是我想搞点分数,分多的大佬麻烦赏赐点,没分的可以找找我另一个同样的...
API :GetScrollBarInfo GetScrollInfo SetScrollInfo PostMessage SendMessage 的实例 忙得很没有整理,自用备忘!嫌文件乱就不要下啦,我自己用的,如果要下的,直接看form2里面的api类!
主要介绍了VC中SendMessage和PostMessage的区别,较为全面的分析了SendMessage和PostMessage运行原理及用法上的不同之处,非常具有实用价值,需要的朋友可以参考下
使用postMessage SendMessage 进程间通讯 管道 剪贴板 邮槽 共享内存 在子父进程间用postmessage通讯,本来用管道是最好的
1.保证无毒 2.简单,方便,实用 3.实例可以自行改用 4.如有非法,本人无法律责任,由改动代码人负责! 5.需要更多本人作品,查找标签“朱建强” 6.请下载,杀毒后再使用!
一种将CString对象发送到当前进程中的Windows的可靠机制。
主要介绍了VC自定义消息响应函数postmessage用法示例,并对比说明了postmessage与sendmessage的用法区别,需要的朋友可以参考下
VC++消息传递,实现自定义消息,消息的映射,通过 postmessage和sendmessage实现消息的映射,非队列消息
postMessage在使用时,需要传入2个参数,data和originUrl。data是指需要传递的内容,但是部分浏览器只能处理字符串参数,所以我们一般把data序列化一下,即JSON.stringify(),originUrl是指目标url,指定的窗口。 ...
http://blog.csdn.net/lindonglian/article/details/43315681
现在大部分人都很熟悉handler这个东西了,我们常用handler的场景无非有两个: ...1. 它和sendMessage()有什么区别? 2. 它有什么独特作用呢? 下结论之前我们先通过源码来分析: /** * Causes the Runnable r to be