美文网首页
c#使用SendMessage进程间通信

c#使用SendMessage进程间通信

作者: 北风知我意 | 来源:发表于2018-08-24 21:09 被阅读174次

使用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进程间通信

    使用SendMessage向另一进程发送WM_COPYDATA消息 Send端: using System; us...

  • .Net 设计模式

    C#进程之间的通信 a.使用SendMessage向另一进程发送WM_KEYDOWN消息 1.进程之间的通讯方式:...

  • C# 进程间通信

    使用SendMessage向另一进程发送WM_COPYDATA消息 Send端: Get端: 参考文档: c# 进...

  • C#命名管道通信

    C#命名管道通信 最近项目中要用c#进程间通信,以前常见的方法包括RMI、发消息等。但在Windows下面发消息需...

  • 6. 进程间通信

    参考链接:1. 进程间通信及使用场景2. 进程间通信机制IPC3. 看图理解进程间通信IPC==重点4. 进程间通...

  • Android面试Android基础(十一)

    问:Android中的IPC(进程间通信)机制? 答:进程间通信即:跨进程的通信。有以下几种:1、使用Bundle...

  • electron主进程与渲染进程通信,webview与其加载页间

    1:进程间通信 进程间通信使用 ipcMain与ipcRenderer模块,参考:https://www.w3cs...

  • linux进程间通信(1)

    一、进程通信概述 1、什么是进程间通信?什么是线程间通信? 进程间通信: 进程间通信就指的是用户空间中进程A与进程...

  • 知识库 - 收藏集 - 掘金

    Android 进程间通信 AIDL详解 - 掘金最近项目有进程间通信的需求,我使用的是IPC通信的方式,这是An...

  • C# 进程间通信(一)

    Introduction 最近接到一个任务,需要把两个exe间的通信模式由 COM 改为非 COM 的模式。 原因...

网友评论

      本文标题:c#使用SendMessage进程间通信

      本文链接:https://www.haomeiwen.com/subject/miwiiftx.html