`
zhangsk
  • 浏览: 31423 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

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, 
00);
  
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, 
00);
  
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.
分享到:
评论

相关推荐

    PostMessage和SendMessage的区别

    在探讨《PostMessage和SendMessage的区别》这一主题时,我们深入分析了两种消息发送机制的特点、应用场景以及它们在多线程环境中的行为差异。通过详细解释PostMessage与SendMessage的工作原理,我们可以更好地理解这...

    SendMessage与PostMessage区别

    在Windows编程中, SendMessage 和 PostMessage 是两个非常重要的API函数,它们都用于进程间或线程间的通信,向目标窗口发送消息。然而,两者的工作机制和应用场景有所不同。 **SendMessage** 函数是同步的,它会将...

    在C#中SendMessage和PostMessage的参数传递

    在C#中SendMessage和PostMessage的参数传递 在C#中可以使用Window API提供的SendMessage和PostMessage来传递参数。两者的区别简单介绍下:返回值的不同,我们先看一下 MSDN 里的声明: LRESULT SendMessage( HWND ...

    c# 线程通信PostMessage SendMessage PeekMessage

    本主题将深入探讨`FindWindow`、`PostMessage`、`SendMessage`以及`PeekMessage`这四个关键函数,它们在Windows API中扮演着重要的角色,特别是在线程间通信和窗口消息处理方面。 1. **FindWindow**: `FindWindow...

    MFC程序通过SendMessage或PostMessage实现进程间通信,实现很简单

    本篇文章将深入探讨如何使用MFC中的`SendMessage`和`PostMessage`函数来实现简单的进程间通信。 首先,`SendMessage`和`PostMessage`都是Windows API中处理消息的核心函数,它们都用于在窗口之间发送消息。但两者的...

    PostMessage SendMessage

    在Windows API中,`PostMessage`和`SendMessage`是两个重要的消息处理函数,它们用于线程间或线程内的通信,向目标窗口发送消息。这两个函数在编程中扮演着关键角色,尤其在处理用户界面(UI)更新和异步操作时。让...

    MFC Sendmessage和Postmessage的使用

    2.两个对话框CMessageDlg和ConeDlg; 3.CMessageDlg为父窗口,ConeDlg为子窗口; 4.父窗口上有一个按钮用于弹出子窗口,子窗口也有一个按钮用来触发事件; 5.子窗口的按钮触发事件后,发送消息给父窗口,然后在...

    SendMessage PostMessage 消息处理详解

    本文将深入探讨`SendMessage`和`PostMessage`这两个函数,它们都是Windows API中用于发送消息的重要工具。朱建强先生的作品,通过实例解析了这两个函数的使用方法,非常适合初学者和有经验的开发者参考。 `...

    在C# API 消息处理 SendMessage PostMessage 进程通信 发消息 实例 文档资料

    主要示例在C#中的SendMessage,PostMessage,包含两个示例,一个资料文档,希望受用。 在C#中 API 消息处理 SendMessage PostMessage 进程通信 发消息 实例 文档资料

    通过PostMessage,SendMessage将CString发送和发布到Windows

    SendMessage将CString发送和发布到Windows”指的是在Microsoft的Windows操作系统环境中,使用C++编程语言,特别是MFC(Microsoft Foundation Classes)框架时,如何利用`PostMessage`和`SendMessage`这两个API函数来...

    PostMessage 后台模拟按键 MOUSE VC原码

    `PostMessage`函数就是...通过分析这两个文件,你可以更深入地理解如何在VC++中使用`PostMessage`进行后台模拟按键和鼠标操作。学习这段代码有助于提升你在Windows API和C++编程上的技能,特别是与人机交互相关的部分。

    MFC通过SendMessage或PostMessage实现两个进程通信功能,实现很简单

    资源包含两个源程序,里面是借用MFC的消息通信实现简单的两个进程间通信,嗯主要是通过SendMessage或PostMessage,功能实现简单便捷。该资源是我想搞点分数,分多的大佬麻烦赏赐点,没分的可以找找我另一个同样的...

    PostMessage

    在实际开发中,开发者需要根据具体需求选择合适的消息传递方式,如PostMessage、SendMessage、QueueUserAPC等,以实现高效且稳定的程序运行。理解并熟练掌握PostMessage的使用,对于编写高质量的Windows应用程序至关...

    API :GetScrollBarInfo GetScrollInfo SetScrollInfo PostMessage SendMessage 的实例

    API :GetScrollBarInfo GetScrollInfo SetScrollInfo PostMessage SendMessage 的实例 忙得很没有整理,自用备忘!嫌文件乱就不要下啦,我自己用的,如果要下的,直接看form2里面的api类!

    进程间用postMessage发消息 ,在实际开发中的实例,

    与`PostMessage`不同,`SendMessage`是同步的,直到消息被处理,调用才会返回。这种方法在需要确保消息被立即处理的情况下比较合适,但可能会阻塞调用线程。 3. 管道(Pipe):在Windows系统中,管道是一种低级的...

    postMessage详解和demo

    - **iframe通信**:当一个页面包含了一个来自不同源的iframe时,`postMessage`可以用来在主页面和iframe之间交换数据。 - **窗口通信**:打开的新窗口或弹窗可以通过`postMessage`向父窗口或者兄弟窗口发送消息。 - ...

    VC中SendMessage和PostMessage的区别

    在VC++编程中,了解和正确使用`SendMessage`和`PostMessage`是非常关键的,它们都是Windows API中用于进程间通信的重要函数,用于向窗口发送消息。这两个函数虽然功能相似,但在实现方式和使用场景上有着显著的区别...

    VC自定义消息响应函数postmessage用法示例

    `PostMessage` 和 `SendMessage` 都是Windows API中用于发送消息的函数,但它们的工作方式有所不同,尤其在异步和同步处理上有所区别。在VC++(Visual C++)环境中,我们经常需要自定义消息来实现特定功能。下面将...

    QT 中使用 Windows API----SendMessage() 进行窗体间消息传递

    如果你需要非阻塞的消息发送,可以考虑使用`PostMessage()`函数。 总结一下,通过结合QT和Windows API,我们可以利用`SendMessage()`函数实现在不同窗口之间的消息传递,提供了一种不同于QT信号槽机制的交互方式。...

Global site tag (gtag.js) - Google Analytics