C# 通过copydata实现进程间通信

最近公司需要实现一个基于copydata进程间通信的功能。原来一直没有接触过Windows的进程通信,这次正好可以学习一下。

程序是基于Winform的,下面直接上代码。

公共类:

public class ImportFromDLL
        {
            public const int WM_COPYDATA = 0x004A;

            //启用非托管代码
            [StructLayout(LayoutKind.Sequential)]
            public struct COPYDATASTRUCT
            {
                public int dwData;    //not used
                public int cbData;    //长度
                [MarshalAs(UnmanagedType.LPStr)]
                public string lpData;
            }

            [DllImport("User32.dll")]
            public static extern int SendMessage(
                IntPtr hWnd,     // handle to destination window
                int Msg,         // message
                IntPtr wParam,    // first message parameter
                ref COPYDATASTRUCT pcd // second message parameter
            );

            [DllImport("User32.dll", EntryPoint = "FindWindow")]
            public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

            [DllImport("Kernel32.dll", EntryPoint = "GetConsoleWindow")]
            public static extern IntPtr GetConsoleWindow();

        }

发送方:

private void SendMessage()
        {
            //声明变量
            string filepath = @"D:\GetMsg.exe";//接收消息程序路径
            string strText= "hello world!";//发送的消息//遍历系统中运行的进程,获取接收消息的进程
            Process[] processes = Process.GetProcesses();
            Process process = null;
            foreach (Process p in processes)
            {
                try
                {
                    //这两个进程的某些属性一旦访问就抛出没有权限的异常
                    if (p.ProcessName != "System" && p.ProcessName != "Idle")
                    {
                        if (p.ProcessName == "GetMsg")
                        {
                            process = p;
                            break;
                        }
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                }
            }

            //如果接收消息的进程未运行,则开启程序
            if (process == null)
            {//启动接收消息程序
                process = System.Diagnostics.Process.Start(filepath);
                Thread.Sleep(100);//等待接收消息的程序完全打开,否则消息不能发送成功。
            }

            //接收端的窗口句柄
            IntPtr hwndRecvWindow = process.MainWindowHandle;

            //自己的进程句柄
            IntPtr hwndSendWindow = Process.GetCurrentProcess().Handle;

            //填充COPYDATA结构
            ImportFromDLL.COPYDATASTRUCT copydata = new ImportFromDLL.COPYDATASTRUCT();
            copydata.cbData = Encoding.Default.GetBytes(strText).Length; //长度 注意不要用strText.Length;
            copydata.lpData = strText;//内容  

            //发送消息
            ImportFromDLL.SendMessage(hwndRecvWindow, ImportFromDLL.WM_COPYDATA, hwndSendWindow, ref copydata);

            return;
        }

接收方:

protected override void WndProc(ref Message m)
        {
            if (m.Msg == ImportFromDLL.WM_COPYDATA)//根据Message.Msg区分消息类型,ImportFromDLL.WM_COPYDATA为发送方定义的消息类型
            {
                ImportFromDLL.COPYDATASTRUCT copyData = (ImportFromDLL.COPYDATASTRUCT)m.GetLParam(typeof(ImportFromDLL.COPYDATASTRUCT));//获取数据
                MessageBox.Show(copyData.lpData);
            }
            base.WndProc(ref m);
        }

注:

1、发送方和接收方均可以用C++、JAVA等实现,此处就不再做讨论。

2、在发送方。如果接收方未开启,就打开接收方,在打开的同时,使用了:

Thread.Sleep(100);//等待接收消息的程序打开,否则消息不能发送成功

让程序等待。若不想让程序等待,由想传递消息给接收方,则可以考虑使用一下开启进程的重载方法:

public static Process Start(string fileName, string arguments);
public static Process Start(string fileName, string userName, SecureString password, string domain);
public static Process Start(string fileName, string arguments, string userName, SecureString password, string domain);

具体使用说明,可参照API文档。

时间: 2024-10-24 21:46:38

C# 通过copydata实现进程间通信的相关文章

win ce 下的进程间通信--copydata方式

使用WM_COPYDATA的消息通信,保证发送数据从原进程到目标进程,允许在进程间传递少量的只读数据,使用sendmessage()函数,接收方在数据完成复制前不能返回. //函数原型 LRESULT SendMessage( HWND hWnd, //接受消息的窗口句柄 UINT Msg, //要发送的消息,这里是WM_COPYDATA WPARAM wParam, LPARAM lParam ); //copydata的结构体 typedef struct tagCOPYDATASTRUCT

利用WM_COPYDATA消息实现进程间通信

进程间通信最简单的方式就是发送WM_COPYDATA消息,下面通过例子来实现. 发送WM_COPYDATA消息: SendMessage(hRecvWnd, WM_COPYDATA, (WPARAM)hSendWnd, (LPARAM)&CopyData); 其中的CopyData为COPYDATASTRUCT结构类型,该结构定义如下: typedef struct tagCOPYDATASTRUCT { DWORD dwData; DWORD cbData; PVOID lpData; } C

通过WM_COPYDATA消息完成进程间通信

完成进程间通信最简单的方式就是发送WM_COPYDATA消息. (1)发送WM_COPYDATA消息 SendMessage(接收窗口句柄, WM_COPYDATA, (WPARAM)发送窗口句柄, (LPARAM)&copyData); 其中的copyData是要发送的数据,类型为COPYDATASTRUCT结构体: typedef struct tagCOPYDATASTRUCT { DWORD dwData; DWORD cbData; PVOID lpData; } COPYDATAST

进程间通信-字符串的传递

近来写了个简单的音乐播放器, 每次双击音乐文件, 都会再次运行一个实例, 觉得不太方便, 只需一个运行着的实例即可, 因此着手解决这个问题.    最常用的方法, 当然是在查找当前相同的进程名称, 如果有,则退出, 没有则初始化本实例. 方法比较简单,但有效.private static bool FoundRunningInstance(){ Process currentProcess = Process.GetCurrentProcess(); Process[] procList = P

Linux进程间通信总结

Linux进程间通信总结 1. 管道 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: (1)管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管道: (2)只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程): (3)单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中. (4)数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出

Xenomai 进程间通信方式

Xenomai 进程间通信方式分成Xenomai域内的IPC以及Xenomai域和Linux域之间的IPC, 目前采用的rtipc(RTDM驱动)的方式,主要是给用户空间提供socket接口,实时应用 通过调用对应的接口可以避免切换到Linux域而导致实时性降低.rtipc对应了三个协议: XDDP (Xenomai域和Linux域之间的IPC) IDDP和BUFP (Xenomai域内的IPC) 另外,原有的RT_PIPE机制仍旧支持,但从Xenomai 3开始就不支持了. http://ww

31、互斥锁与进程间通信

我们之前做了多进程并发,那么你们有没有发现问题.如果说多个进程共享同一个数据,比如抢火车票大家同时在客户端查看同时购买会出现什么问题呢?今天我们将讲述进程锁还有进程间通信,进程之间彼此隔离,他们需要一个第三方联系起来. 一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行的修改,没错,速度是慢了,牺牲了速度而保证了数据安全. 1.上厕所 先举个通俗易懂

一起talk C栗子吧(第八十五回:C语言实例--使用信号进行进程间通信二)

各位看官们,大家好,上一回中咱们说的是使用信号进行进程间通信的样例,这一回咱们接着上一回的内容,继续说该样例.闲话休提.言归正转. 让我们一起talk C栗子吧. 我们在上一回中举了使用信号进行进程间通信的样例,在该样例中.我们通过终端发出信号.当进程收到该信号后让它运行系统对信号定义的默认动作.这一回.我们再来举一个使用信号进行进程间通信的样例,只是.我们发送和处理信号的方式和上一回的样例不一样.在接下来的样例中,我们在一个进程中使用kill产生信号.在另外一个进程中接收而且依照自己的方式处理

进程间通信 详解

进程间通信(IPC)介绍 进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息. IPC的方式通常有管道(包括无名管道和命名管道).消息队列.信号量.共享存储.Socket.Streams等.其中 Socket和Streams支持不同主机上的两个进程IPC. 以Linux中的C语言编程为例. 一.管道 管道,通常指无名管道,是 UNIX 系统IPC最古老的形式. 1.特点: 它是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端.