Sendmessage和Postmessage的区别(详细)+SendMessage参数大全

本文详细介绍了Windows编程中SendMessage和PostMessage的区别,包括它们的返回值意义、同步异步特性、消息处理方式以及各自适用场景。同时列举了SendMessage函数的常用参数,帮助开发者更好地理解和使用这两个函数。
摘要由CSDN通过智能技术生成

sendmessage和postmessage的区别
PostMessage只负责将消息放到消息队列中,不确定何时及是否处理    SendMessage要等到受到消息处理的返回码(DWord类型)后才继续    PostMessage执行后马上返回    SendMessage必须等到消息被处理后才会返回。

 

1、首先是返回值意义的区别,我们先看一下 MSDN 里的声明:

LRESULT SendMessage(
        HWND hWnd,
        UINT Msg,
        WPARAM wParam,
        LPARAM lParam
);
BOOL PostMessage(
        HWND hWnd,
        UINT Msg,
        WPARAM wParam,
        LPARAM lParam
);

  其中 4 个参数的意义是一样的,返回值类型不同(其实从数据上看他们一样是一个 32 位的数,只是意义不一样),LRESULT 表示的是消息被处理后的返回值,BOOL 表示的是消息是不是 Post 成功。

2、PostMessage 是异步的,SendMessage 是同步的。
  PostMessage 只把消息放入队列,不管消息是否被处理就返回,消息可能不被处理;而 SendMessage 等待消息被处理完了之后才返回,如果消息不被处理,发送消息的线程将一直被阻塞。

3、如果在同一个线程内,SendMessage 发送消息时,由 USER32.DLL 模块调用目标窗口的消息处理程序,并将结果返回。SendMessage 在同一线程中发送消息并不入线程消息队列。PostMessage 发送消息时,消息要先放入线程的消息队列,然后通过消息循环分派到目标窗口(DispatchMessage)。

  如果在不同线程内,SendMessage 发送消息到目标窗口所属线程的消息队列,然后发送消息的线程在 USER32.DLL 模块内监视和等待消息处理,直到目标窗口处理完返回。SendMessage 在返回前还做了很多工作,比如,响应别的线程向它 SendMessage。Post 到别的线程时,最好用 PostThreadMessage 代替 PostMessage,PostMessage 的 hWnd 参数可以是 NULL,等效于 PostThreadMessage + GetCurrentThreadId。Post WM_QUIT 时,应使用 PostQuitMessage 代替。

4、系统只整编(marshal)系统消息(0 到 WM_USER 之间的消息),发送用户消息(WM_USER 以上)到别的进程时,需要自己做整编。

  用 PostMessage、SendNotifyMessage、SendMessageCallback 等异步函数发送系统消息时,参数里不可以使用指针,因为发送者并不等待消息的处理就返回,接受者还没处理指针就已经被释放了。

5、在 Windows 2000/XP 里,每个消息队列最多只能存放 10,000 个 Post 的消息,超过的还没被处理的将不会被处理,直接丢掉。这个值可以改得更大:[HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/Windows] USERPostMessageLimit,最小可以是 4000

SendMessage参数大全

Windows是一个消息驱动式系统,SendMessage是应用程序和应用程序之间进行消息传递的主要手段之一,这里我搜集整理了SendMessage函数的详细参数介绍,以备自用。

LRESULT SendMessage(      

    HWND hWnd,
    UINT Msg,
    WPARAM wParam,
    LPARAM lParam
);

参数1:hWnd-窗口句柄。窗口可以是任何类型的屏幕对象。

参数2:wMsg-用于区别其他消息的常量值.

参数3:wParam-通常是一个与消息有关的常量值,也可能是窗口或控件的句柄.

参数4: lParam-通常是一个指向内存中数据的指针。

wMsg参数常量值:

#DeFine WM_CREATE 0x01

创建一个窗口

#DeFine WM_DESTROY 0x02

当一个窗口被破坏时发送

#DeFine WM_MOVE 0x03

移动一个窗口

#DeFine WM_SIZE 0x05

改变一个窗口的大小

#DeFine WM_ACTIVATE 0x06

一个窗口被激活或失去激活状态

#DeFine WM_SETFOCUS 0x07

一个窗口获得焦点

#DeFine WM_KILLFOCUS 0x08

一个窗口失去焦点

#DeFine WM_ENABLE 0x0A

一个窗口改变成Enable状态

#DeFine WM_SETREDRAW 0x0B

设置窗口是否能重画

#DeFine WM_SETTEXT 0x0C

应用程序发送此消息来设置一个窗口的文本

#DeFine WM_GETTEXT 0x0D

应用程序发送此消息来复制对应窗口的文本到缓冲区

#DeFine WM_GETTEXTLENGTH 0x0E

得到与一个窗口有关的文本的长度(不包含空字符)

#DeFine WM_PAINT 0x0F

要求一个窗口重画自己

#DeFine WM_CLOSE 0x10

当一个窗口或应用程序要关闭时发送一个信号

#DeFine WM_QUERYENDSESSION 0x11

当用户选择结束对话框或程序自己调用ExitWindows函数

#DeFine WM_QUIT 0x12

用来结束程序运行

#DeFine WM_QUERYOPEN 0x13

当用户窗口恢复以前的大小位置时

### 回答1: sendmessagepostmessage都是Windows API中的函数,用于在不同的线程之间发送消息。 sendmessage是同步的,它会等待消息处理完毕后才返回,而postmessage是异步的,它会立即返回,不等待消息处理完毕。 sendmessagepostmessage参数和返回值都不同,sendmessage的返回值是消息处理函数的返回值,而postmessage的返回值是一个布尔值,表示消息是否成功发送。 在使用这两个函数时需要注意线程安全问题,如果在不同的线程之间发送消息,需要使用线程同步机制来保证数据的正确性。 ### 回答2: 在Windows操作系统中,sendmessagepostmessage是两种常用的消息发送函数。它们都可以通过系统消息队列来发送消息,但实现的机制和使用方式有所不同。 sendmessage函数是一种同步的消息发送方式,它会将消息发送到指定的窗口,并等待窗口处理完这个消息后再返回。sendmessage函数还可以传递一些参数,用于指定不同的事件类型或数据等。sendmessage通常用于与用户交互的操作中,如按钮点击等,因为它会阻塞主线程直到消息处理完毕,这也带来了一定的性能损失。 postmessage函数则是一种异步的消息发送方式,它会立即将消息发送到指定的窗口,但不会等待窗口处理完这个消息。postmessage函数并没有返回值,因此在消息处理完之前,调用者也无法得知该消息是否已被处理。postmessage通常用于耗时的后台操作中,如网络请求或文件读写等,因为它不会阻塞主线程,避免了性能损失。 此外,sendmessagepostmessage还有一些其他的区别。例如,由于sendmessage是同步的,所以它会阻塞线程,直到消息处理完毕;而postmessage是异步的,它不会阻塞线程,而是直接将消息发送到消息队列中等待处理。此外,它们在传递参数的方式上也略有不同,sendmessage通常直接将参数传递给相应的窗口处理函数,而postmessage则会将参数打包为消息结构体中的参数传递。 ### 回答3: SendMessagePostMessage都是Windows API中用于在窗口间发送消息的函数。它们的用途都是向指定的窗口发送一个消息,但发送的方式不同。 SendMessage函数是同步的,也就是在接收到消息之前,它会一直等待直到接收方处理完这个消息。这种方式的好处是发送者可以立即知道接收方是否处理了这个消息,适合在需要获取返回值的情况下使用。 但是,由于SendMessage是同步的,如果接收方长时间无法处理该消息,发送者就会发生阻塞,可能会导致程序崩溃或者卡顿。 PostMessage函数是异步的,发送完消息后就立即返回,不会等待接收方的处理结果。这种方式的优点是不会阻塞程序的运行,同时可以保证消息的可靠传递。因此,如果只需要把消息发送出去,并不需要立即得到它是否被接收方处理,可以考虑使用PostMessage。 总之,SendMessagePostMessage在使用时需要根据实际情况选择。如果接收方需要立即响应这个消息,或者需要同步返回结果,那么应该选择SendMessage函数。如果不关心返回结果,只是需要发出消息,那么可以考虑使用PostMessage
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值