C#发送和接收消息

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace WpfApp1
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.Title = "CsharpMessage";                   //窗口名称
            this.Loaded += MainWindow_Loaded;               //加载
            this.Closed += MainWindow_Closed;               //关闭
        }
        IntPtr hwnd;

        const int WM_COPYDATA = 0x004A;                     //内存区

        public struct COPYDATASTRUCT                        //结构体
        {
            public IntPtr dwData;
            public int cData;
            [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }
        private void MainWindow_Closed(object sender, EventArgs e)      //窗口关闭
        {
            try
            {
                HwndSource.FromHwnd(hwnd).RemoveHook(WndProc);
            }
            catch (Exception) { }
        }
        private void MainWindow_Loaded(object sender, RoutedEventArgs e)        //窗口重载
        {
            hwnd = new WindowInteropHelper(this).Handle;
            HwndSource.FromHwnd(hwnd).AddHook(new HwndSourceHook(WndProc));
        }
        [DllImport("User32.dll")]
        public static extern int SendMessage(int hwnd, int msg, int wParam, ref COPYDATASTRUCT IParam);
        [DllImport("User32.dll")]
        public static extern int FindWindow(string lpClassName, string lpWindowName);

        private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)        //消息接收
        {
            if (msg == WM_COPYDATA)
            {
                COPYDATASTRUCT cdata = new COPYDATASTRUCT();
                Type mytype = cdata.GetType();
                cdata = (COPYDATASTRUCT)Marshal.PtrToStructure(lParam, mytype);
                switch (cdata.dwData.ToInt32())
                {
                    case 1:
                        {
                            //MessageBox.Show(cdata.dwData.ToString());
                            button.Content = cdata.dwData.ToString();
                            break;
                        }
                    default:
                        //MessageBox.Show(cdata.dwData.ToString());
                        button.Content = cdata.dwData.ToString();
                        break;
                }
            }

            return IntPtr.Zero;
        }

        private void button_Click(object sender, RoutedEventArgs e)                                 //发送消息
        {
            String strSend = "C#发送的信息";
            int nMessageId = 100;

            if (CshapSendMessage(nMessageId, strSend))
            {
                MessageBox.Show("发送消息成功");
            }
            else
            {
                MessageBox.Show("消息发送失败,请打开VcMessage程序");
            }
        }
        private bool CshapSendMessage(int nMessgeId, String strSend)        
        {
            int WINDOW_HANDLE = FindWindow(null, "CshapMessage");                                   //VcMessage为向C++程序发送的窗口名称
            if (WINDOW_HANDLE != 0)
            {
                COPYDATASTRUCT cdata;
                cdata.dwData = (IntPtr)100;                                                         //这里可以传入一些自定义的数据,但只能是4字节整数 
                cdata.lpData = strSend;                                                             //消息字符串
                cdata.cData = System.Text.Encoding.Default.GetBytes(strSend).Length + 1;            //注意,这里的长度是按字节来算的

                SendMessage(WINDOW_HANDLE, WM_COPYDATA, 0, ref cdata);
            }
            else
            {
                return false;
            }
            return true;
        }

    }
}

猜你喜欢

转载自blog.csdn.net/qq_34329383/article/details/76392435