控制台程序使用SendMessage进行进程间的通信

消息发送者代码

本实例中创建窗体类ProxyForm,负责发送和接收数据。

Main方法代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleSender
{
    class Program
    {
        static void Main(string[] args)
        {
            ProxyForm proxy = new ProxyForm();
            Console.WriteLine("Sender:美女,晚上出去玩玩吧!");
            proxy.SendMessage("Sender:美女,晚上出去玩玩吧!");
            Console.WriteLine("按下任意键退出程序!");
            Console.ReadKey();
        }
    }
}

窗体类ProxyForm代码

using System;
using System.Diagnostics;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace ConsoleSender
{
    public partial class ProxyForm : Form
    {
        private const int WM_COPYDATA = 0x004A;
        private IntPtr hWndDest = IntPtr.Zero;// handle to destination window

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

        public ProxyForm()
        {
            InitializeComponent();
        }

        protected override void DefWndProc(ref System.Windows.Forms.Message m)
        {
            switch (m.Msg)
            {
                case WM_COPYDATA:
                    CopyDataStruct cds = new CopyDataStruct();
                    cds = (CopyDataStruct)m.GetLParam(cds.GetType());
                    Console.WriteLine("Reciver:" + cds.lpData.ToString());
                    base.DefWndProc(ref m);
                    break;

                default:
                    base.DefWndProc(ref m);
                    break;
            }
        }

        public int SendMessage(string msg)
        {
            try
            {
                Process[] procs = Process.GetProcesses();
                foreach (Process p in procs)
                {
                    if (p.ProcessName.Equals("ConsoleReciver"))
                    {
                        hWndDest = p.MainWindowHandle;
                    }
                }
                CopyDataStruct cds;
                cds.dwData = (IntPtr)100;
                cds.lpData = msg;
                cds.cbData = (msg.Length + 1) * 2;
                return SendMessage(hWndDest, WM_COPYDATA, (int)this.Handle, ref cds);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }

    /// <summary>
    /// 使用COPYDATASTRUCT来传递数据
    /// </summary>
    [StructLayout(LayoutKind.Sequential)]
    public struct CopyDataStruct
    {
        public IntPtr dwData;
        public int cbData;
        [MarshalAs(UnmanagedType.LPWStr)]
        public string lpData;
    }
}

消息接收者代码

using System;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace ConsoleReciver
{
    public partial class Form1 : Form
    {
        private const int WM_COPYDATA = 0x004A;

        private IntPtr hWndDest = IntPtr.Zero;// handle to destination window

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

        public Form1()
        {
            InitializeComponent();
        }

        protected override void DefWndProc(ref System.Windows.Forms.Message m)
        {
            switch (m.Msg)
            {
                case WM_COPYDATA:

                    CopyDataStruct recivedCds = new CopyDataStruct();
                    recivedCds = (CopyDataStruct)m.GetLParam(recivedCds.GetType());
                    hWndDest = m.WParam;
                    CopyDataStruct sendCds = new CopyDataStruct();
                    sendCds.dwData = (IntPtr)100;
                    sendCds.lpData = "你发给我的信息我已经收到,内容是:" + recivedCds.lpData.ToString();
                    sendCds.cbData = (sendCds.lpData.Length + 1) * 2;

                    SendMessage(hWndDest, WM_COPYDATA, (int)this.Handle, ref sendCds);

                    base.DefWndProc(ref m);
                    break;

                default:
                    base.DefWndProc(ref m);
                    break;
            }
        }

        /// <summary>
        /// 使用COPYDATASTRUCT来传递数据
        /// </summary>
        [StructLayout(LayoutKind.Sequential)]
        public struct CopyDataStruct
        {
            public IntPtr dwData;
            public int cbData;
            [MarshalAs(UnmanagedType.LPWStr)]
            public string lpData;
        }
    }
}

程序执行结果

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-07 22:16:21

控制台程序使用SendMessage进行进程间的通信的相关文章

linux 进程间的通信

现在linux使用的进程间通信方式:(1)管道(pipe)和有名管道(FIFO)(2)信号(signal)(3)消息队列(4)共享内存(5)信号量(6)套接字(socket) 为何进行进程间的通信:A.数据传输:一个进程需要将它的数据发送给另一个进程,发送的数据量在一个字节到几M字节之间B.共享数据:多个进程想要操作共享数据,一个进程对共享数据的修改,别的进程应该立刻看到.C.通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程).D.资源共享

Linux进程间的通信

一.管道 管道是Linux支持的最初Unix IPC形式之一,具有以下特点: A. 管道是半双工的,数据只能向一个方向流动: B. 需要双工通信时,需要建立起两个管道: C. 只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程): D. 单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中. 匿名管道的创建:该函数创建的管道的两端处于一个进程中间,在实际应用中没有太大意义;因此,一

进程间的通信:管道

进程间的通信:管道 Linux中将命令联系到一起使用实际上就是把一个进程的输出通过管道传递给另一个进程的输入,这些都是shell封装好的,对标准输入和输出流进行了重新连接,使数据流从键盘输入经过两个程序最终输出到屏幕上.如下: cmd1|cmd2 进程管道 在两个程序之间传递数据最简单的方法就是使用popen()和pclose()了.原型如下: #include <stdio.h> FILE *popen(const char *command, const char *open_mode);

Linux/UNIX进程间的通信(1)

进程间的通信(1) 进程间的通信IPC(InterProcessCommunication )主要有以下不同形式: 半双工管道和FIFO:全双工管道和命名全双工管道:消息队列,信号量和共享存储:套接字和STREAMS 管道 pipe函数 当从一个进程连接到另一个进程时,我们使用术语管道.我们通常是把一个进程的输出通过管道连接到另一个进程的输入. 管道是由调用pipe函数创建的: #include<unistd.h> int pipe(intpipefd[2]); 经由参数pipefd返回两个文

进程间的通信简单总结

运行在不同的端系统的之间的通信: 进程指运行在端系统上的一个程序. 若要进行进程之间的通信,那么进程肯定就是成对出现的. 进程间的通信你可以想象是两个人用电话进行交流,然后它必须需要进行通信的一些基础设施,这个基础设施就是套接字,如果你在在两个进程之间进行数据交流,你可以把套接字想象成一个门,你打开门把你要传递的数据丢出去,然后另一个进程打开门,然后就收数据. 但是你把数据丢出门,它是如何找到目的地,另一个进程呢?数据报从一个进程找到另一个进程这就是进程寻址.你在打电话你需要提供电话号码,因此你

Android进程间的通信

1.概述:由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于android系统中4种应用程序组件:Activity.Content Provider.Broadcast和Service.其中Activity可以跨进程调用其他应用程序的Activity:Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回),当然,也可

进程间的通信——邮槽与命名管道d

进程间的通信是指在系统中两个或多个进程之间通过第三方进行数据共享. 1.邮槽. 邮槽是window系统提供的一种单向通信的机制.即进程中的一方只能写入或者读取数据,而另一方则只能读取或写入数据.通过邮槽,可以实现一对多或跨网络的进程之间的通信.但邮槽传输的数据量非常小,一般只有400KB左右. 邮槽创建函数CreateMailslot,函数原型: HANDLE CreateMailslot( LPCTSTR lpName, // mailslot name DWORD nMaxMessageSi

Linux/UNIX之进程间的通信(2)

进程间的通信(2) 有三种IPC我们称为XSI IPC,即消息队列.信号量以及共享存储器,它们之间有很多相似之处. 标识符和键 每个内核的IPC结构(消息队列.信号量或共享存储段)都用一个非负整数的标识符加以引用.例如,为了对一个消息队列发送或取消息,只需要知道其队列标识符.与文件描述符不同,IPC标识符不是小的整数.当一个IPC结构被创建,以后被删除时,与这种结果相关的标识符连续加1,知道达到一个整型数的最大值,然后又回到0. 标识符是IPC对象的内部名.为使多个合作进程能够在同一IPC对象上

同步线程和进程间的通信

最近回去学习了一下进程和进程间的通信,有时候很多东西久不看了也就一下子忘了== 这里面有好几个互斥对象使用线程的 1 void mListText(CString str) 2 { 3 m_list_text.AddString(str); 4 m_list_text.SendMessage(WM_VSCROLL, SB_PAGEDOWN, 0); 5 } 6 7 8 9 DWORD WINAPI Thread1(LPVOID lpParameter) 10 { 11 //GetDlgItem(