c#使用SendMessage进程间通信

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

Send端:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Navigation;

using System.Windows.Shapes;

using System.Runtime.InteropServices;

namespace SentTest

{

    ///

    /// MainWindow.xaml 的交互逻辑

    ///

    public partial class MainWindow : Window

    {

        public MainWindow()

        {

            InitializeComponent();

            this.Title = "发送窗口";

        }

        const int WM_COPYDATA = 0x004A;

        public struct COPYDATASTRUCT

        {

            public IntPtr dwData;

            public int cData;

            [MarshalAs(UnmanagedType.LPStr)]

            public string lpData;

        }

        [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 void button1_Click(object sender, RoutedEventArgs e)

        {

            String strSent = "需要发送的信息";

            int WINDOW_HANDLE = FindWindow(null, "接收窗口");

            if (WINDOW_HANDLE != 0)

            {

                byte[] arr = System.Text.Encoding.Default.GetBytes(strSent);

                int len = arr.Length;

                COPYDATASTRUCT cdata;

                cdata.dwData = (IntPtr)100;

                cdata.lpData = strSent;

                cdata.cData = len + 1;

                SendMessage(WINDOW_HANDLE, WM_COPYDATA, 0, ref cdata);

            }

        }

    }

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

Get端:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Data;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Imaging;

using System.Windows.Navigation;

using System.Windows.Shapes;

using System.Runtime.InteropServices;

using System.Windows.Interop;

namespace GetTest

{

    ///

    /// MainWindow.xaml 的交互逻辑

    ///

    public partial class MainWindow : Window

    {

        IntPtr hwnd;

        public MainWindow()

        {

            InitializeComponent();

            this.Title = "接受窗口";

            this.Loaded += new RoutedEventHandler(MainWindow_Loaded);

            this.Closed += new EventHandler(MainWindow_Closed);

        }

        void MainWindow_Loaded(object sender, RoutedEventArgs e)

        {

            //窗口加载完毕才可用,否则会报错。

            hwnd = new WindowInteropHelper(this).Handle;

            HwndSource source = HwndSource.FromHwnd(hwnd);

            if (source != null) source.AddHook(WndProc);

        }

        void MainWindow_Closed(object sender, EventArgs e)

        {

            try

            {

                HwndSource.FromHwnd(hwnd).RemoveHook(WndProc);

            }

            catch (Exception)

            {

                throw;

            }

        }

        const int WM_COPYDATA = 0x004A;//WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。

        //Windows在通过WM_COPYDATA消息传递期间,不提供继承同步方式。

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

        public struct COPYDATASTRUCT

        {

            public IntPtr dwData;

            public int cData;

            [MarshalAs(UnmanagedType.LPStr)]

            public string lpData;

        }

        //wpf用此方法

        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);

                this.textBox1.Text = cdata.lpData;

            }

            return IntPtr.Zero;

        }

        //WinFrom用此方法

        /* protected override void DefWndProc(ref Message m)

        {

            switch (m.Msg)

            {

            case WM_COPYDATA:

                COPYDATASTRUCT cdata = new COPYDATASTRUCT();

                Type mytype = cdata.GetType();

                cdata = (COPYDATASTRUCT)m.GetLParam(mytype);

                this.textBox1.Text = cdata.lpData;

                break;

            default:

                base.DefWndProc(ref m);

                break;

            }

        } */

    }

}

你可能感兴趣的:(c#使用SendMessage进程间通信)