zoukankan      html  css  js  c++  java
  • 利用SendMessage实现C#进程间通信

    进程之间通讯的几种方法:
    在程序中,各个进程之间常常需要交换数据,进行数据通讯。常用的方法有:
    使用内存映射文件
    通过共享内存DLL共享内存
    使用SendMessage向另一进程发送WM_COPYDATA消息
    比起前两种的复杂实现来,WM_COPYDATA消息无疑是一种经济实惠的一中方法.(ZT)
    WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。在通过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;
    该结构用来定义用户数据。

    具体过程如下:
    首先,在发送方,用Find到接受方的句柄,然后向接受方发送WM_COPYDATA消息.
    接受方在DefWndProc事件中,来处理这条消息.由于中文编码是两个字节,所以传递中文时候字节长度要搞清楚.
    具体体代码如下:
    //----------------------------------发送方----------------------------------
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System..Forms;
    using System.Runtime.InteropServices;

    namespace WinFormSendMsg
    {
        public partial class Form1 : Form
        {
            const int WM_COPYDATA = 0x004A;
            public Form1()
            {
                InitializeComponent();
            }

            [DllImport("User32.dll", EntryPoint = "SendMessage")]
            private static extern int SendMessage(
                int hWnd, // handle to destination BR>            int Msg, // message
                int wParam, // first message parameter
                ref COPYDATASTRUCT lParam // second message parameter
            );

            [DllImport("User32.dll", EntryPoint = "Find)]
            private static extern int Findstring lpClassName, string lpame);

            private void button1_Click(object sender, EventArgs e)
            {
                //int HANDLER = Findnull, @"欲发送程序窗口的标题");
                int HANDLER = Findnull, @"接收窗口的标题");
                if (HANDLER != 0)
                {
                    byte[] sarr = System.Text.Encoding.Default.GetBytes(this.textBox1.Text);
                    int len = sarr.Length;
                    COPYDATASTRUCT cds;
                    cds.dwData = (IntPtr)100;
                    cds.lpData = this.textBox1.Text;
                    cds.cbData = len + 1;
                    SendMessage(HANDLER, WM_COPYDATA, 0, ref cds);
                }
            }
        }

        public struct COPYDATASTRUCT
        {
            public IntPtr dwData;
            public int cbData;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }
    }
    //----------------------------------接收方----------------------------------
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System..Forms;
    using System.Runtime.InteropServices;

    namespace WinFormGetMsg
    {
        public partial class Form1 : Form
        {
            const int WM_COPYDATA = 0x004A;

            public Form1()
            {
                InitializeComponent();
            }

            protected override void DefWndProc(ref System..Forms.Message m)
            {
                switch (m.Msg)
                {
                    case WM_COPYDATA:
                        COPYDATASTRUCT mystr = new COPYDATASTRUCT();
                        Type mytype = mystr.GetType();
                        mystr = (COPYDATASTRUCT)m.GetLParam(mytype);
                        this.textBox1.Text = mystr.lpData;
                        break;
                    default:
                        base.DefWndProc(ref m);
                        break;
                }
            }

            public struct COPYDATASTRUCT
            {
                public IntPtr dwData;
                public int cbData;
                [MarshalAs(UnmanagedType.LPStr)]
                public string lpData;
            }
        }
    }

  • 相关阅读:
    vue-cli模拟后台数据交互
    打卡谱
    前端面试题
    ps简单切图
    常见浏览器兼容性问题与解决方案
    扯淡 测量体质公式 哈哈哈哈会不会封我号
    JAVASCRIPT 转换字符串杂记
    日记(六)
    gitshell 基础操作
    gitshell fork别人项目
  • 原文地址:https://www.cnblogs.com/uwking/p/2029385.html
Copyright © 2011-2022 走看看