C# 使用SendMessage进行进程通信,可发送字符串,结构体

发送时只能以结构体形式发送,类的话会提示“指定结构必须能直接复制到本机结构中,或是具有布局信息 ”的错误提示

以下两种结构体示例都可以被发送

 public struct A
    {
        public A(int a)
        {
            name = "heow";
            array = new double[3] { 1, 2, 5.6 };
        }
         string name;//{ get; set; }
         double[] array ;//{ get; set; }
    }

/// <summary>
        /// 定义结构体
        /// </summary>
        public struct COPYDATASTRUCT
        {
            public IntPtr dwData; //可以是任意值
            public int cbData;    //指定lpData内存区域的字节数
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData; //发送给目录窗口所在进程的数据
        }

       

发送方:

        [DllImport("User32.dll", EntryPoint = "SendMessage")]
        private static extern int SendMessage(int hWnd, int Msg, int wParam, ref COPYDATASTRUCT lParam);
 
        [DllImport("User32.dll", EntryPoint = "FindWindow")]
        private static extern int FindWindow(string lpClassName, string lpWindowName);


        const int WM_COPYDATA = 0x004A;//必须是这个数值,不能更改
 
        private void btnSend_Click(object sender, EventArgs e)
        {
            int hWnd = FindWindow(null, @"消息接受者");
            if (hWnd == 0)
            {
                MessageBox.Show("未找到消息接受者!");
            }
            else
            {
                string sendString = "测试发送数据";
                byte[] sarr = System.Text.Encoding.Default.GetBytes(sendString);
                int len = sarr.Length;
                COPYDATASTRUCT cds;
                cds.dwData = (IntPtr)0 ;
                cds.cbData = len + 1;
                cds.lpData = sendString;
                SendMessage(hWnd, WM_COPYDATA, 0, ref cds);
            }

        }

接受方:

    private static int WMA_InterPro = 0x004A;
        protected override void DefWndProc(ref Message m)
        {
          
            if (m.Msg == WMA_InterPro)
            {
                COPYDATASTRUCT cds = new COPYDATASTRUCT();
                Type t = cds.GetType();
                cds = (COPYDATASTRUCT)m.GetLParam(t);
               string receiveInfo=cds.lpData;  
            }
             else
            {
                base.DefWndProc(ref m);
            }
        }

PS:

C# 使用SendMessage进行进程通信,可发送字符串,结构体(不能发送类类型)

相关推荐

  1. C# Socket发送、接收结构

    2024-05-12 19:54:02       41 阅读
  2. # .NET Framework中使用命名管道进行进程通信

    2024-05-12 19:54:02       63 阅读
  3. C语言:进程通信

    2024-05-12 19:54:02       20 阅读
  4. DELETE 请求,如何通过ajax进行发送

    2024-05-12 19:54:02       63 阅读
  5. 如何使用PHP进行邮件发送

    2024-05-12 19:54:02       35 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-12 19:54:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-12 19:54:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-05-12 19:54:02       87 阅读
  4. Python语言-面向对象

    2024-05-12 19:54:02       96 阅读

热门阅读

  1. The 17-th BIT Campus Programming Contest C.小L的旅行

    2024-05-12 19:54:02       31 阅读
  2. Ubuntu服务器如何安装桌面

    2024-05-12 19:54:02       32 阅读
  3. 修复公路[并查集结构体]

    2024-05-12 19:54:02       30 阅读
  4. k8s部署数据库等pass产品的时候用那种控制器

    2024-05-12 19:54:02       29 阅读
  5. Hoot100-T6三数之和

    2024-05-12 19:54:02       35 阅读
  6. 1081:分苹果

    2024-05-12 19:54:02       28 阅读
  7. leetcode 797.所有可能的路径

    2024-05-12 19:54:02       33 阅读
  8. 软件工程与软件质量

    2024-05-12 19:54:02       31 阅读
  9. python.完数和斐波那契数列

    2024-05-12 19:54:02       37 阅读
  10. sso单点登录

    2024-05-12 19:54:02       35 阅读
  11. Dockerfile 基本结构

    2024-05-12 19:54:02       37 阅读