sendmessage和postmessage

来源:互联网 发布:0基础如何自学数控编程 编辑:程序博客网 时间:2024/06/14 06:09
PostMessage只负责将消息放到消息队列中,不确定何时及是否处理SendMessage要等到受到消息处理的返回码(DWord类型)后才继续PostMessage执行后马上返回SendMessage必须等到消息被处理后才会返回。

1、sendmessage和postmessage的区别

两个函数的声明如下:

    LRESULTSendMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);    BOOLPostMessage( HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);  

   可以看出两个函数的参数是一样的,就是返回值的类型不同。LRESULT 表示的是消息被处理后的返回值,BOOL 表示的是消息是不是Post 成功。PostMessage 只把消息放入队列,不管消息是否被处理就返回,消息可能不被处理;而 SendMessage等待消息被处理完了之后才返回,如果消息不被处理,发送消息的线程将一直被阻塞。如果在同一个线程内,SendMessage 发送消息时,由USER32.DLL 模块调用目标窗口的消息处理程序,并将结果返回。SendMessage在同一线程中发送消息并不入线程消息队列。PostMessage发送消息时,消息要先放入线程的消息队列,然后通过消息循环分派到目标窗口

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

    例如:

    CStringstr;

   str="双击了根节点";   ::PostMessage(active->m_hWnd,WM_RIGHTVIEW_MEWWAGE,1,(LPARAM)(&str));//给右边视图发消息;

   接收消息的处理函数收到的第二个参数会是一空指针。

   也可以把str定义为类的变量,这样只要类实例不释放,str的指针就不会被释放。经测试这样可以传递。但这样做的话。在第二次利用PostMessage发送的时侯,如果重新给str赋值,而第一次发送的消息还没有处理的话。那么接下来消息处理函数处理第一次发的消息时,所得到的参数不是原来的值,而是第二次发送重新赋的值。

2、按钮、列表等控件的启用和禁用                                     

   实现列表等控件的启用和禁用可以调用CButton::EnableWindow()函数(因为CButton是从CWnd继承下来的)

   如果列表有对就的变量如CListBox m_CListProjectName;则可以调m_CListProjectName.EnableWindow(false)禁用按钮,调用m_CListProjectName.EnableWindow(true)启用按钮。

   如果没有对应的变量,可以调用((CButton*)GetDlgItem(按钮ID))->EnableWindow(FALSE);禁用按钮

0 0
原创粉丝点击