我是按照步骤添加的自定义消息呀,但是为什么成功添加消息后,不能成功接收消息?1.在stdafx.h中添加: #define WM_ADD_NEW_MSG (WM_USER + 100)2.CDownloadFileDlg.h文件中添加:class CDownloadFileDlg : public CDialog
{
// 构造
public:
CDownloadFileDlg(CWnd* pParent = NULL); // 标准构造函数// 对话框数据
enum { IDD = IDD_DOWNLOADFILE_DIALOG }; protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon; // 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg LRESULT AddNewMessage(WPARAM wParam, LPARAM lParam);
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOk();
afx_msg void OnBnClickedCancel();
TaskInfo readInitFile();
void DialogDownloadFile(TaskInfo& task);};
   3.在CDownloadFileDlg.cpp文件中添加:
BEGIN_MESSAGE_MAP(CDownloadFileDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_MESSAGE(WM_ADD_NEW_MSG, AddNewMessage)
//}}AFX_MSG_MAP
ON_BN_CLICKED(IDOK, &CDownloadFileDlg::OnBnClickedOk)
ON_BN_CLICKED(IDCANCEL, &CDownloadFileDlg::OnBnClickedCancel)
END_MESSAGE_MAP()    4.在CDownloadFileDlg.cpp文件中实现AddNewMessage函数
LRESULT CDownloadFileDlg::AddNewMessage(WPARAM wParam, LPARAM lParam)
{
char *p = (char*)lParam;
CString msg = CString(p);
delete p; static DWORD id = 1;
CString tmpStr;
tmpStr.Format(_T("%ld: %s"), id++, msg);
((CListBox*)GetDlgItem(IDC_LISTDisplay))->SetFocus();
((CListBox*)GetDlgItem(IDC_LISTDisplay))->AddString(tmpStr);
int count = ((CListBox*)GetDlgItem(IDC_LISTDisplay))->GetCount();
((CListBox*)GetDlgItem(IDC_LISTDisplay))->SetCurSel(count - 1); return 1;
}5.在别的类中发送消息:
       char *pBuf = new char[msg.GetLength() + 1];
memcpy(pBuf, msg, msg.GetLength() + 1);
::PostMessage(*pWnd, WM_ADD_NEW_MSG, 0, (LPARAM)pBuf);调试结果显示,PostMessage消息是成功的,但是始终不进入AddNewMessage函数,所以,证明没收到消息,可是所有的步骤我都正确添加了呀,为什么会收不到消息?

解决方案 »

  1.   

    粗略的看了楼主的代码。
    发现3个问题1. ::PostMessage(*pWnd, WM_ADD_NEW_MSG, 0, (LPARAM)pBuf);
    第一个参数是句柄吧,*pWnd是啥??CWnd吧。 目标窗体指针GetSafeHwnd();2.你传输的时候用PostMessage传输内存指针,PostMessage走消息队列的,char *pBuf 感觉是栈申请的呢
    到处理的时候时候都没有值了。改成SendMessage妥当,或者pBuf 改成全局的,还能用PostMessage3.delete p;虽然我明白是针对char *pBuf = new char[msg.GetLength() + 1];
    但是看起来也太恐怖了。放到析构里吧(这一点你自己斟酌下,可以无视,编程规范问题)
      

  2.   

    ::PostMessage(*pWnd, WM_ADD_NEW_MSG, 0, (LPARAM)pBuf);
    pWnd这个是否有值,要不换成pWnd->GetSafeHandle()试试
      

  3.   

    *pWnd 这个值我传递的是dialog主窗口,我传递的是 &m_hWnd, 从dialog类传递过去的,调试的时候也查看了,这个值和m_hWnd的值一样,所以应该没什么问题
      

  4.   

    非常搞笑,我在vc6.0上用PostMessage正常工作,在vs2008上就不行。在vs2008上只能用SendMessage.
      

  5.   

    在别的类中可以通过如下方式向主对话框发送消息,还省去传窗口指针麻烦。AfxGetApp()->GetMainWnd()->SendMessage(WM_MESSAGE,0,buf);获取应用程序->获取主窗口-->发送消息