调试一下看一看,失败的那种发送方式PostMessage的时候窗口句柄参数对不对,
对比一下点击菜单调用PostMessage时和列表控件切换选中行时调用PostMessage的窗口句柄值是不是一样的。

解决方案 »

  1.   

    void CXXXDlg::PushRefreshWin(RefreshWin *r)
    {
    this->EnterCriticalSection_refreshs(); this->m_refreshs.Add(r); this->LeaveCriticalSection_refreshs(); BOOL res=this->PostMessageA(ID_RefreshWin);
    }
    都是调用此函数,调试时PostMessageA函数都返回1
      

  2.   

    用VisualStudio自带的SPY++工具抓一抓窗口上的消息看看?看看失败时,窗口有没有收到ID_RefreshWin消息。
    重写CWinApp::PreTranslateMessage,在里面拦截一下ID_RefreshWin消息看看,打个断点,看看“某一列表控件切换选中行时”,
    ID_RefreshWin消息会不会进到PreTranslateMessage中来
      

  3.   

    确实能接收到消息。
    但是不会进入PreTranslateMessageBOOL CXXXDlg::PreTranslateMessage(MSG* pMsg)
    {
    // TODO: 在此添加专用代码和/或调用基类
    if (pMsg->message == WM_KEYDOWN)
    {
    if (pMsg->wParam == VK_ESCAPE)
    return TRUE;
    if (pMsg->wParam == VK_RETURN)
    return TRUE;
    }
    else if(pMsg->message==ID_RefreshWin)
    {
    CArray<RefreshWin * > arr;
    this->EnterCriticalSection_refreshs(); for(int i=0,count=this->m_refreshs.GetSize();i<count;i++)
    arr.Add(this->m_refreshs[i]);
    this->m_refreshs.RemoveAll(); this->LeaveCriticalSection_refreshs(); for(int i=0,count=arr.GetSize();i<count;i++)
    {
    arr[i]->Refresh(*this);
    delete arr[i];
    }
    }
    return CDialog::PreTranslateMessage(pMsg);
    }
      

  4.   

    总是 0x1931 , 可能 不是 地方。把 其他的 postmessage 注释掉 试试。
      

  5.   

    // TODO: 在此添加专用代码和/或调用基类
    if (pMsg->message == WM_KEYDOWN)
    {
    if (pMsg->wParam == VK_ESCAPE)
    return TRUE;
    if (pMsg->wParam == VK_RETURN)
    return TRUE;
    }
    这一段是防止按esc 和 回车 退出的。屏蔽掉之后,还是没有响应ID_RefreshWin消息。
      

  6.   

    1.另一线程向窗口发ID_RefreshWin消息,正常
    2.某一列表控件切换选中行时发ID_RefreshWin消息,没有作用,没有执行响应此消息的代码
    3.点击菜单然后发送ID_RefreshWin消息,正常
    先注释掉 1,3 看看。
      

  7.   

    PostMessage 不保证 消息 被 接受到。SendMessage 试试。
      

  8.   


    也许是这样。
    本来想把相同的代码放到同一个地方的,但是算了,我还是在响应选中行改变的消息中处理所有事情了,不post消息了。反正响应消息的线程只有一个,不会造成访问数据冲突。
      

  9.   

    PostMessage只管送出,不管是否送到