在调试程序的时候发现,用PostMessage 传出去的值在我使用的时候已经发生了变化,百思不得其解。

用循环去找一个文件,找到的文件名称暂存在一个临时变量里面,找到之后把这个名称传到另外的函数处理,调试发现,处理的总是在我需要的文件后面找到的文件,原因是在我使用的时候那个暂存变量里面的值已经发生了变化(循环已经处理到了下一步了),

PostMessage 和SendMessage的区别主要在于是否等待其他程序消息处理。PostMessage只是把消息放入队列,不管其他程序是否处理都返回,然后继续执行;而SendMessage必须等待其他程序处理消息后才返回,继续执行。这两个函数的返回值也不同,PostMessage的返回值表示PostMessage函数执行是否正确,而SendMessage的返回值表示其他程序处理消息后的返回值。

使用SendMessage()可以解决这个问题,只不过在时间效率上会有点下降。

函数原型:
   LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);
   BOOL       PostMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam);

LRESULT 返回消息被处理的结果,在消息被处理之后才会返回。BOOL 只是返回传送的结果,是不是已经送到消息队列。

从网络上找到一些资料:
   
1      PostMessage 是异步的,SendMessage 是同步的。
         PostMessage 只把消息放到队列,不管消息是不是被处理就返回,消息可能不被处理;
         SendMessage等待消息被处理完了才返回,如果消息不被处理,发送消息的线程将一直处于阻塞状态,等待消息的返回。

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

3         不同线程:
            SendMessage 发送消息到目标窗口的消息队列,然后发送消息的线程在USER32。DLL模块内监视和等待消息的处理结果,直到目标窗口的才处理返回,SendMessage在返回之前还需要做许多工作,如响应别的线程向它发送的SendMessage().PostMessge() 到别的线程的时候最好使用PostThreadMessage  代替。PostMessage()的HWND 参数可以为NULL,相当于PostThreadMessage() + GetCrrentThreadId.

4         系统处理消息。
            系统只处理(marshal)系统消息(0--WM_USER),发送用户消息(用户自己定义)时需要用户自己处理。
            使用PostMessage,SendNotifyMessage,SendMessageCallback等异步函数发送系统消息时,参数不可以使用指针,因为发送者不等待消息的处理就返回,接收者还没有处理,指针就有可能被释放了,或则内容变化了。

5 在Windows 2000/XP,每个消息队列最多只能存放一定数量的消息,超过的将不会被处理就丢掉。系统默认是10000;:[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows] USERPostMessageLimit
可以修改(我的系统下没有发现)。

在控制别的应用程序的时候,经常需要等待直到某个功能结束,例如:
   打开一个窗口-->等待直到窗口结束 ,这个时候就可以用到SendMessage
   如果在打开这个窗口后仍然需要对该窗口的界面进行设置,比如Editvalue等等,比如:
      打开一个窗口-->控制窗口的control的属性
   这个时候就需要PostMessage

使用一个钩子程序截获消息后,使用SendMessage把消息发送到主处理程序进行处理,但是在主处理程序还没有完成任务的时候,被设置钩子的程序进入了停止的状态,不可以处理 WM_PAINT, WM_MOVE, .......等的基本信息必须要等SendMessage发送出的消息完成后,才能继续运行,整个界面一片空白,把钩子消息设置成PostMessage的发送消息形式后,问题解决!

      PostMessage只是把消息放入队列,不管其他程序是否处理都返回,然后继续执行;
   而SendMessage必须等待其他程序处理消息后才返回,继续执行。
      PostMessage
的返回值表示PostMessage函数执行是否正确;
   而SendMessage的返回值表示其他程序处理消息后的返回值。 
   使用这两个发送消息函数的最重要的是要看你的程序是否要对消息的滞后性关注否,PostMessage会造成消息的滞后性,SendMessage则不会,但如