首 页IT知识库翔宇问吧收藏本站
当前位置:算搜IT乐园IT知识库C#专区高级应用

C#应用程序之间相互通信的方法

减小字体增大字体作者:佚名  来源:51csharp.com  发布时间:2014-10-30 17:29:16

有时,我们需要两个应用程序之间发送消息,本文就转载了一篇文章介绍了实现此功能的方法。

注意这里发送消息的函数:public static void SendMessage(string destProcessName, int msgID, string strMsg),只能发送一个msgID和一个strMsg, 接收方只接收了strMsg,我的项目中已经够用了,你如果需要读msgID,还需要改一下。客户端代码请参考csdn上的原文自己写吧。

进程之间通讯的几种方法:

在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯。常用的方法有

(1)使用内存映射文件

(2)通过共享内存DLL共享内存

(3)使用SendMessage向另一进程发送WM_COPYDATA消息

比起前两种的复杂实现来,WM_COPYDATA消息无疑是一种经济实惠的一种方法.

WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。Windows在通过WM_COPYDATA消息传递期间,不提供继承同步方式。

SDK文档推荐用户使用SendMessage函数,接受方在数据拷贝完成前不返回,这样发送方就不可能删除和修改数据:

这个函数的原型及其要用到的结构如下:

SendMessage(hwnd, WM_COPYDATA, wParam, lParam);

其中: WM_COPYDATA对应的十六进制数为0x004A

wParam设置为包含数据的窗口的句柄。

lParam指向一个COPYDATASTRUCT的结构:

typedef struct tagCOPYDATASTRUCT
{
   DWORD dwData; //用户定义数据
   DWORD cbData; //数据大小
   PVOID lpData; //指向数据的指针
} COPYDATASTRUCT;

该结构用来定义用户数据。

具体过程如下:

首先,在发送方,用FindWindow找到接受方的句柄,然后向接受方发送WM_COPYDATA消息。

接受方在DefWndProc事件中处理这条消息。由于中文编码是两个字节, 所以传递中文时候字节长度要搞清楚。

protected override void DefWndProc(ref System.Windows.Forms.Message m) {
  switch(m.Msg) {
    case WinMessageUtil.WM_COPYDATA:
      string str = WinMessageUtil.ReceiveMessage(ref m);
      break;
    default:
      break;
   }
  base.DefWndProc(ref m);
}

using System;
using System.Runtime.InteropServices;
using System.Diagnostics;

namespace Speeding.Util
{
    //WM_COPYDATA消息所要求的数据结构
    public struct CopyDataStruct
    {
        public IntPtr dwData; //这里注意,一定要用IntPtr网上好多别的用的int会出错
        public int cbData;
        [MarshalAs(UnmanagedType.LPStr)]
        public string lpData;
    }

    /// <summary>
    /// 本类封装了一些进程间通讯的细节
    /// </summary>
    public class WinMessageUtil
    {
        public const int WM_COPYDATA = 0x004A;
        //通过窗口的标题来查找窗口的句柄
        [DllImport("User32.dll",EntryPoint="FindWindow")]
        private static extern int FindWindow(string lpClassName, string lpWindowName);
        //在DLL库中的发送消息函数
        [DllImport("User32.dll",EntryPoint="SendMessage")]
        private static extern int SendMessage
        (
            int hWnd, // 目标窗口的句柄
            int Msg, // 在这里是WM_COPYDATA
            int wParam, // 第一个消息参数
            ref CopyDataStruct lParam // 第二个消息参数
        );

        /// <summary>
        /// 发送消息,只能传递一个自定义的消息ID和消息字符串,想传一个结构,但没成功
        /// </summary>
        /// <param name="destProcessName">目标进程名称,如果有多个,则给每个都发送</param>
        /// <param name="msgID">自定义数据,可以通过这个来决定如何解析下面的strMsg</param>
        /// <param name="strMsg">传递的消息,是一个字符串</param>
        public static void SendMessage(string destProcessName, int msgID, string strMsg)
        {
            if(strMsg == null) return;
            //按进程名称查找,同名称的进程可能有许多,所以返回的是一个数组
            Process []foundProcess = Process.GetProcessesByName(destProcessName);
            foreach(Process p in foundProcess)
            {
                int toWindowHandler = p.MainWindowHandle.ToInt32();
                if(toWindowHandler != 0)
                {
                   CopyDataStruct cds;
                   cds.dwData = (IntPtr) msgID; //这里可以传入一些自定义的数据,但只能是4字节整数
                   cds.lpData = strMsg; //消息字符串
                   cds.cbData = System.Text.Encoding.Default.GetBytes(strMsg).Length + 1; //注意,这里的长度是按字节来算的
                  //发送方的窗口的句柄, 由于本系统中的接收方不关心是该消息是从哪个窗口发出的,所以就直接填0了
                  int fromWindowHandler = 0;
                  SendMessage(toWindowHandler, WM_COPYDATA, fromWindowHandler, ref cds);
                }
              }
          }
          /// <summary>
          /// 接收消息,得到消息字符串
          /// </summary>
          /// <param name="m">System.Windows.Forms.Message m</param>
          /// <returns>接收到的消息字符串</returns>
          public static string ReceiveMessage(ref System.Windows.Forms.Message m)
          {
            CopyDataStruct cds = (CopyDataStruct) m.GetLParam(typeof(CopyDataStruct));
            return cds.lpData;
        }
    }
}

转载于:http://www.51csharp.com/WinForm/winform_933.html

Tags:C#

知识评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论

用户名:查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 1分

内 容:

            请注意用语文明且合法,不要发布带有攻击性、侮辱性的言论,谢谢合作!

        通知管理员 验证码:

关于本站 | 网站帮助 | 广告合作 | 网站声明 | 友情连接 | 网站地图 | 用户守则 | 联系我们
本站部分内容来自互联网,如有侵权,请来信告之,谢谢!
Copyright © 2007-2019 suansuo.cn. All Rights Reserved.
网站备案号:黑ICP备13005378号-3
资产负债表未分配利润公式怎么设置,怎么详细全面的分析一份财务报表?_参德股票网人均家庭存款,如果每年交万把块钱的房地产税,城市的普通人能承受吗?_厕角股票网两年平均增长率计算方法,B站up主怎么赚钱?_侧求股票网股票开盘价由什么决定,本人刚学习炒股,我想知道股票价格变化,趋势这些背后的买卖双方的心理因素,有什么书籍推荐吗?_册炔股票网所有者权益与净利润,固定资产处置之后的损益计入损益类和所有者权益类,在可靠性和中立性上的区别?_册寸股票网跌停的股票换手率很高,股票“换手率”有这几个特征,往往是主力拉升的前兆,早晚都会涨_策朴股票网机构越多的股票越好吗,我的核心股票池(2021更新)科创就是创业板吗,科创板,新三板,创业板等的“板”是什么意思,为什么要用“板”这个字来形容?流动资产与非流动资产的区别,威豪说 | 常用的财务分析方法在哪些?博时中证银行指数基金,现在适合入手中证红利指数基金吗?铜陵有色是蓝筹股吗,2021.12.06周一晚间评论:刚刚大爆!谁是RRR减产后第二天的最大受益者?创业板具有什么特点,什么是 创业板?股票发行股数,企业为什么要非公开发行股票?江汽集团发行后有哪些变化?今日创业板指数行情走势图,创业板这轮行情的最高点大概是多少?公司股份51和49的差别,收购1号店约49%股权,实现全资控股关于股票的参考文献,小白,想要了解一下股票这一行,有什么好的书籍或者视频推荐学习一下?全球企业排名,世界五百强企业里什么类型的企业居多?量性研究论文,论文研究数据分析与量化投资的前景,11个数据分析模型,超实用!直接拿它分析问题!量化投资的技术,量化投资中有没有完美的参数寻优方式?A股有哪些股票分红比较好,既然股票分红要除权,那A股分红有什么意义?看完你就明白了A股与h股账户影响的分析,频繁上市的中国人寿这次“喜欢”了CPIC H股恒生ETF分红,110031易方达恒生中国企业etf联接A还有救嘛?a股跟h股有什么区别,香港联交所上市H股公司和香港联交所非H股上市公司的区别在哪里呀?名词解释权益法(长期股权投资),金融相关的专业名词的通俗解释,给小白看的,求解啊?k线图分析法视频,有大神可以帮忙分析这只股票的k线吗?股票k线技术形态分析图解,如何判断主力洗盘?庄家洗盘K线形态图解k线图中的三条线颜色怎么看同花顺,股票的趋势伊利股票技术面分析,20210922股市分析和20210923股市预测怎么样?k线形态分析,常见的主力洗盘k线形态有哪些?