我自定义一个消息
#define WM_MYMSG  WM_USER + 100用SendMessage发送此消息时,窗口函数接收不到,但是用PostMessage却可以,这是为什么啊?我的程序要进行同步处理不能用PostMessage,怎么办?我用的是VS2008。

解决方案 »

  1.   

    应该是可以的,怎么接收不到呢?你又是怎么处理的呢?SendMessage之后在PreTranslateMessage中处理的??
      

  2.   

    下面是很早以前我自己写的心得,供你参考一下: 
    1 发送消息的程序中比较简单,在要发送的地方加入如下代码就行了: 
    void   CSendDlg::OnSend() 

    //   TODO:   Add   your   control   notification   handler   code   here CString   str= "这是我要发送的给另外一个进程字符串。 "; 
    COPYDATASTRUCT   myCopyDATA; 
    myCopyDATA.cbData=str.GetLength(); 
    myCopyDATA.lpData=str.GetBuffer(0); 
    str.ReleaseBuffer(); 
    HWND   hwnd=::FindWindow(NULL, "Receive ");             //假设目标程序窗口标题为 "Receive " 
    if   (hwnd) 
    ::SendMessage(hwnd,WM_COPYDATA,NULL,(LPARAM)&myCopyDATA); 
    else 
    AfxMessageBox( "目标程序没有运行。 "); } 
    2 接收消息的程序(这里假设是基于对话框的工程)请按如下步骤来实现: 
    先给对话框类CReceiveDlg(如果你的接收程序为SDI工程的话,把CReceiveDlg类换成CMainFrame类)添加一个消息处理函数LRESULT   OnReceive(WPARAM   wParam,LPARAM   lParam),代码如下: 
    LRESULT   CReceiveDlg::OnReceive(WPARAM   wParam,LPARAM   lParam) 

    COPYDATASTRUCT   *p   =   NULL   ; 
    p   =   (COPYDATASTRUCT*)lParam; 
    CString   strTemp; 
    memcpy(strTemp.GetBuffer((int)p-> cbData),p-> lpData,p-> cbData); 
    strTemp.ReleaseBuffer(); 
    AfxMessageBox(strTemp); 
    return   0; 

    接着再给工程设定刚才添加的函数OnReceive为WM_COPYDATA消息的响应函数,在ReceiveDlg.cpp文件中如下地方加入一行代码: 
    BEGIN_MESSAGE_MAP(CReceiveDlg,   CDialog) 
    //{{AFX_MSG_MAP(CReceiveDlg) 
    ON_WM_PAINT() 
    ON_WM_QUERYDRAGICON() 
    ON_MESSAGE(WM_COPYDATA,OnReceive)           //只要添加这一行进行WM_COPYDATA消息映射 
    //}}AFX_MSG_MAP 
    END_MESSAGE_MAP() 
    好了,现在分别运行两个程序,应该可以在A程序中给B程序发送消息了,B收到消息后会弹出个MessageBox来显示从A程序发送来消息了。