zoukankan      html  css  js  c++  java
  • 用SendMessage发WM_COPYDATA消息

    转载:https://www.cctry.com/thread-78882-1-1.html

    发送方:

     1 CString str="这是我要发送的给另外一个进程字符串。";
     2 COPYDATASTRUCT myCopyDATA;
     3 myCopyDATA.cbData=str.GetLength();
     4 myCopyDATA.lpData=str.GetBuffer(0);
     5 str.ReleaseBuffer();
     6 HWND hwnd=::FindWindow(NULL,"Receive"); //假设目标程序窗口标题为"Receive"
     7 if (hwnd)
     8 ::SendMessage(hwnd,WM_COPYDATA,NULL,(LPARAM)&myCopyDATA);
     9 else
    10 AfxMessageBox("目标程序没有运行。");

    接收消息的程序(这里假设是基于对话框的工程)请按如下步骤来实现:

    先给对话框类CReceiveDlg(如果你的接收程序为SDI工程的话,把CReceiveDlg类换成CMainFrame类)添加一个消息处理函数LRESULT OnReceive(WPARAM wParam,LPARAM lParam),代码如下:

     1 LRESULT CReceiveDlg::OnReceive(WPARAM wParam,LPARAM lParam)
     2 {
     3 COPYDATASTRUCT *p = NULL ;
     4 p = (COPYDATASTRUCT*)lParam;
     5 CString strTemp;
     6 memcpy(strTemp.GetBuffer((int)p->cbData),p->lpData,p->cbData);
     7 strTemp.ReleaseBuffer();
     8 AfxMessageBox(strTemp);
     9 return 0;
    10 }

    接着再给工程设定刚才添加的函数OnReceive为WM_COPYDATA消息的响应函数,在ReceiveDlg.cpp文件中如下地方加入一行代码:

    1 BEGIN_MESSAGE_MAP(CReceiveDlg, CDialog)
    2 //{{AFX_MSG_MAP(CReceiveDlg)
    3 ON_WM_PAINT()
    4 ON_WM_QUERYDRAGICON()
    5 ON_MESSAGE(WM_COPYDATA,OnReceive) //只要添加这一行进行WM_COPYDATA消息映射
    6 //}}AFX_MSG_MAP
    7 END_MESSAGE_MAP()

    好了,现在分别运行两个程序,应该可以在A程序中给B程序发送消息了,B收到消息后会弹出个MessageBox来显示从A程序发送来消息了。

    注:

    COPYDATASTRUCT *p = NULL ;
    p = (COPYDATASTRUCT*)lParam;

    这里如果写成

    COPYDATASTRUCT p =  (COPYDATASTRUCT &)lParam;

    编译时不会报错,但是得到的数据错误

  • 相关阅读:
    C语言II博客作业04
    C语言II博客作业03
    C语言II博客作业02
    C语言II博客作业01
    学期总结
    C语言I博客作业08
    C语言I博客作业07
    C语言I博客作业06
    C语言I博客作业05
    C语言I博客作业04
  • 原文地址:https://www.cnblogs.com/Toya/p/15464593.html
Copyright © 2011-2022 走看看