Win32消息处理API---PostMessage

转载 2012年02月13日 00:07:12

转自:http://blog.csdn.net/mengde666/article/details/4045681

06、PostMessage

功能说明

PostMessage将消息投递到进程的消息队列,不会等待进程处理消息完毕就返回,PostMessage所投递的消息会被进程所调用的GetMessage或者PeekMessage函数所检索。PostMessage对消息的投递行为属于异步发送,即发送消息而不必等待消息被处理之后再返回。PostMessage在投递消息时,系统根据hWnd参数来判断所属进程而投递,投递到创建指定窗口的进程的消息队列中去。

跟SendMessage区别:SendMessage将一个消息发送到接收窗口后不会立即返回,而是等待消息的处理结果,所以SendMessage不但关心消息是否发送成功,而且也要关心消息是否被窗口处理完毕,也就是说SendMessage是同步的。

 

函数原型

B00L PostMessage(

HWND    hWnd,   // 消息的投递方向

UINT    Msg,   // 所发消息之消息ID

WPARAM  wParam,// 所发消息之字参数

LPARAM  lParam  // 所发消息之值参数

);

 

参数

1>、hWnd,【in】

消息的投递方向,可取有特定含义的两个值:

Value

描述

HWND_BROADCAST

消息的投递方向为:系统的所有顶层窗口,包括无效的、不可见的无属配的窗口以及被覆盖的窗口和弹出式窗口,而不包含它们的子窗口。

NULL

函数行为跟调用PostThreadMessage(其参数dwThread为当前线程ID)一样。

 

2>、Msg,【in】

指定的要投递的消息。

3>、wParam,【in】

发送消息的字参数,跟消息类型、性质相关。

4>、lParam,【in】

发送消息的值参数,跟消息类型、性质相关。

返回值

如果函数调用成功(消息投递成功),返回非零值;如果函数调用失败,返回值是零

 

备注

需要以 HWND_BROADCAST方式投递消息的应用程序,应当用函数 RegisterwindwosMessage来获得应用程序间通信的特征消息。

Win32下:系统仅仅为系统级消息进行封送处理(那些定义在0到WM_USER 范围内的消息),要发送自定义消息(那些数值定义在WM_USER之上的消息)到另一个进程,用户必须进行自定义封送处理(就是编组处理之意)。

如果发送一个系统级消息(在0到WM_USER范围内)给异步消息函数(PostMessage.SendNotifyMessage,SendMesssgeCallback),消息参数不能包含指针,否则,操作将会失败。因为函数在接收进程对消息处理完毕之前就返回了,并且消息发送者也会在内存被使用之前就释放掉了。

不要使用PostMessage函数投递WM_QUIT消息,要使用PostQuitMessage函数。

Windows 2000/XP: 每个消息队列有10,000个投递消息数量限制。然而这个限制可以根据实际需求被设置为充分的大,如果你的应用程序对投递消息的需求量超过这个限制,应当重新设计,以避免消耗太多的系统资源。如果要调整这个限制,需要修改注册表项如下:

HKEY_LOCAL_MACHINE

SOFTWARE

Microsoft

Windows NT

CurrentVersion

Windows

USERPostMessageLimit

可接受的最低值为4000。

 

适用

Windows NT: 3.1及以上版本;Windows:95及以上版本;Windows CE:1.0及以上版本;头文件:winuser.h;输入库:user32.lib;Unicode:在Windows NT环境下以Unicode和ANSI方式实现。

 

应用举例

    客户端的应用程序可以使用DDE建立一个跟服务端应用程序中某条目(或者叫做项目)的链接,当这样一个链接建立起来之后,服务端周期性地更新被客户端链接的条目(项目)的内容,通常是数值变化(引起客户端同样的变化)。这样就在两个应用之间建立起了永久性的数据流向,一直保持到服务显示地断开。客户端应用程序一般通过投递消息WM_DDE_ADVISE来初始化这条数据链,如下代码所示:

 

if (!(hOptions = GlobalAlloc(GMEM_MOVEABLE, sizeof(DDEADVISE))))  return;

if (!(lpOptions = (DDEADVISE FAR*) GlobalLock(hOptions))) { GlobalFree(hOptions);  return; }

lpOptions->cfFormat  = CF_TEXT;

lpOptions->fAckReq   = TRUE;

lpOptions->fDeferUpd = FALSE;

GlobalUnlock(hOptions);

if ((atomItem = GlobalAddAtom(szItemName)) != 0) {

    if ( !( PostMessage(hwndServerDDE, WM_DDE_ADVISE, (WPARAM)hwndClientDDE,

            PackDDElParam(WM_DDE_ADVISE, (UINT) hOptions, atomItem) ) ) )  {

        GlobalDeleteAtom(atomItem);

        GlobalFree(hOptions);

        FreeDDElParam(WM_DDE_ADVISE, lParam);

    }

}

if (atomItem == 0) {  // Handle errors  }

见MSDN2005之ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.WIN32COM.v10.en/winui/winui/windowsuserinterface/dataexchange/dynamicdataexchange/usingdynamicdataexchange.htm


相关文章推荐

Win32消息处理API---PeekMessage

PeekMessage 功能说明

Win32 SDK基础(10)—— 几种常见的Windows消息处理

一 引言         本文主要介绍几种Windows常见的消息的处理,在《Win32 SDK基础(8)—— Windows消息机制》中,我们介绍了WM_CREATE消息的处理,在窗口创建之前,我...

原谅我今天才学会使用win32的按键消息处理!

之前一直写directX的程序,用到的win32消息并不多,而且大部分的按键捕获都是有directInput完成的,因为能捕获到手柄那样的按键(而且据说还是实时的消息捕获)。。。 今天当我想...

win32 api 滚动条 处理 WM_VSCROLL消息

scroll.c /* ------------------------------------------------------------------- Author:邱于涵 --------...

一种实现Win32消息处理处理函数的新方法 - 基于Thunk实现的类成员消息处理函数

一种实现Win32窗口过程函数(Window Procedure)的新方法 基于Thunk实现的类成员消息处理函数 JERKII.SHANG (JERKII@HOTMAIL.COM) MAR.10t...

一种实现Win32消息处理处理函数的新方法 - 基于Thunk实现的类成员消息处理函数

转自:http://blog.csdn.net/JerKii/archive/2006/04/07/654188.aspx一种实现Win32窗口过程函数(Window Procedure)的新方法基于...

Delphi中使用Win32 API创建内建消息循环的线程函数

Delphi中使用Win32 API创建内建消息循环的线程函数   1.线程创建    HANDLE CreateThread(     LPSECURITY_ATTRIBUTES lpTh...

Win32 API消息函数:SendMessage(发送消息)

Win32 API消息函数:SendMessage(发送消息) 函数功能: 该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程 序处理完消息再返回。...

win32强化练习4.8_TreeView快速应用(处理消息)

只有进行过充分的练习,才能够真正掌握一门技能!通过进行或单项或综合的知识点强化训练,巩固和提高自己的windows程序设计的技能水平!...

win32关于对话框处理不到WM_KEYDOWN消息的解决办法(注:非MFC)

最近碰到一个问题,就是自己DialogBox创建的对话框处理不到WM_KEYDOWN消息,很奇怪!网上看了好多些解答,但是大多数都是说用MFC的PreTranslateMessage来处理,这个对于w...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Win32消息处理API---PostMessage
举报原因:
原因补充:

(最多只允许输入30个字)