• 用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;

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

  • 相关阅读:
    单元测试小示例
    分布式版本控制系统Git的安装与使用
    第一次作业:准备
    结对项目四则运算 “软件”之升级版
    个人项目 — 小学四则运算 “软件”之初版
    生命力
    .net 的前景
    力求简洁,应对变化
    现代软件工程 第一章 【概论】练习与讨论 第6题 邓杰
    现代软件工程 第一章 【概论】练习与讨论 第2题 邓杰
  • 原文地址:https://www.cnblogs.com/Toya/p/15464593.html
Copyright © 2020-2023  润新知