postmessage:SendMessage\PostMessage区别

功能:该将指定消息发送到个或多个窗口为指定窗口窗口直到窗口处理完消息再返回PostMessage区别个消息寄送到个线程消息队列后立即返回

原型:LRESULT SendMessage(HWND hWndUINT MsgWPARAM wParamLPARAM IParam);

参数:

hWnd:其窗口将接收消息窗口句柄如果此参数为HWND_BROADCAST则消息将被发送到系统中所有顶层窗口包括无效或不可见非自身拥有窗口、被覆盖窗口和弹出式窗口但消息不被发送到子窗口

Msg:指定被发送消息

wParam:指定附加消息指定信息

IParam:指定附加消息指定信息

返回值:返回值指定消息处理结果依赖于所发送消息

备注:需要用HWND_BROADCAST通信应用应当使用RegisterWindowMessage来为应用通信取得个唯消息

如果指定窗口是由线程创建则窗口立即作为子如果指定窗口是由区别线程创建则系统切换到该线程并恰当窗口线程间消息只有在线程执行消息检索代码时才被处理发送线程被阻塞直到接收线程处理完消息为止

Windows CE:Windows CE不支持Windows桌面平台支持所有消息使用SendMesssge的前要检查发送消息是否被支持

速查:Windows NT:3.1及以上版本:Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib;Unicode:在Windows NT环境下以Unicode和ANSI方式实现
PostMessage
开放分类: 编程、计算机、API

功能:该个消息放入(寄送)到和指定窗口创建线程相联系消息队列里不等待线程处理消息就返回消息队列里消息通过GetMessage和PeekMessage取得

原型:B00L PostMessage(HWND hWndUINT MsgWPARAM wParamLPARAM lParam);

参数

hWnd:其窗口接收消息窗口句柄可取有特定含义两个值:

HWND.BROADCAST:消息被寄送到系统所有顶层窗口包括无效或不可见非自身拥有窗口、被覆盖窗口和弹出式窗口消息不被寄送到子窗口

NULL:此操作和参数dwThread设置为当前线程标识符PostThreadMessage

Msg:指定被寄送消息

wParam:指定附加消息特定信息

IParam:指定附加消息特定信息

返回值:如果成功返回非零值:如果失败返回值是零若想获得更多信息GetLastError

备注:需要以 HWND_BROADCAST方式通信应用应当用 RegisterwindwosMessage来获得应用间通信独特消息

如果发送个低于WM_USER范围消息给异步消息(PostMessage.SendNotyMessageSendMesssgeCallback)消息参数不能包含指针否则操作将会失败将再接收线程处理消息的前返回发送者将在内存被使用的前释放

速查:Windows NT: 3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib;Unicode:在Windows NT环境下以Unicode和ANSI方式实现 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 在返回前还做了很多工作比如响应别线程向它 SendMessagePost 到别线程时最好用 PostThreadMessage 代替 PostMessagePostMessage hWnd 参数可以是 NULL等效于 PostThreadMessage + GetCurrentThreadIdPost WM_QUIT 时应使用 PostQuitMessage 代替

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

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

5、在 Windows 2000/XP 里每个消息队列最多只能存放 10,000 个 Post 消息超过还没被处理将不会被处.

Tags:  vbpostmessage vbsendmessage vcsendmessage postmessage

延伸阅读

最新评论

发表评论