我有两个exe都在运行中,分别为a.exe和b.exe
当点击a.exe的一个按钮时,需要给b.exe传递一个参数
怎么传呢?穿过去b.exe中怎么接收呢?

解决方案 »

  1.   

    启动a.exe时,给运行中的b.exe发一个消息,
    具体怎么发消息到baidu上查一下就有了.
      

  2.   

    如果用a.exe去启动b.exe的话,可以使用
     System.Diagnostics.Process.Start(b.exe","这里是要传过去的参数");
      

  3.   

    这个就要看楼主的具体需求了,我提供一个思路吧
    1。如果是在a.exe中的某按钮点击时启动b.exe,则可以通过process进程类的argumens直接传递;2。若是两个exe都在运行过程中,则楼主所说的情况就是常见的两个进程之间互相通信的情况了。对于这个我常常是用windows api来实现,就是在a.exe中调用findWindow与sendMessage两个api函数来发送相应的消息,而b.exe重写窗口的消息处理方法来对消息进行判断处理
      

  4.   

     第一个项目包含一个Windows Form(Form1),在Form1上有一个Button和一个TextBox。    第二个项目包含一个Windows Form(Form1),在Form1上有两个Button,分别用来测试第一个应用程序中Button的Click事件和修改第一个应用程序中TextBox的值。    第一个应用程序中Form的代码如下:    using System;
        using System.Drawing;
        using System.Collections;
        using System.ComponentModel;
        using System.Windows.Forms;
        public class Form1 : System.Windows.Forms.Form {
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.TextBox textBox1;
        private System.ComponentModel.Container components = null;
        [STAThread]
        static void Main() {
        Application.Run(new Form1());
        }
        public Form1()    {
        InitializeComponent();
        }
        protected override void Dispose( bool disposing )    {
        if( disposing )    {
        if(components != null)    {
        components.Dispose();
        }
        }
        base.Dispose( disposing );
        }
        #region Windows 窗体设计器生成的代码
        private void InitializeComponent()    {
        this.button1 = new System.Windows.Forms.Button();
        this.textBox1 = new System.Windows.Forms.TextBox();
        this.SuspendLayout();
        //
        // button1
        //
        this.button1.Location = new System.Drawing.Point(32, 24);
        this.button1.Name = "button1";
        this.button1.TabIndex = 0;
        this.button1.Text = "button1";
        this.button1.Click += new System.EventHandler(this.button1_Click);
        //
        // textBox1
        //
        this.textBox1.Location = new System.Drawing.Point(32, 64);
        this.textBox1.Name = "textBox1";
        this.textBox1.TabIndex = 1;
        this.textBox1.Text = "textBox1";
        //
        // Form1
        //
        this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
        this.ClientSize = new System.Drawing.Size(292, 266);
        this.Controls.Add(this.textBox1);
        this.Controls.Add(this.button1);
        this.Name = "Form1";
        this.Text = "Form1";
        this.ResumeLayout(false);
        }
        #endregion
        private void button1_Click(object sender, System.EventArgs e) {
        MessageBox.Show("This is button1 click!");
        }
        }    第二个应用程序中Form的代码如下:    using System;
        using System.Text;
        using System.Drawing;
        using System.Collections;
        using System.ComponentModel;
        using System.Windows.Forms;
        using System.Runtime.InteropServices;
        public class TestForm1 : System.Windows.Forms.Form {
        private System.Windows.Forms.Button button1;
        private System.Windows.Forms.Button button2;
        private System.ComponentModel.Container components = null;
        [STAThread]
        static void Main() {
        Application.Run(new TestForm1());
        }
        public TestForm1()    {
        InitializeComponent();
        }
        protected override void Dispose( bool disposing )    {
        if( disposing )    {
        if(components != null)    {
        components.Dispose();
        }
        }
        base.Dispose( disposing );
        }
        #region Windows 窗体设计器生成的代码
        private void InitializeComponent()    {
        this.button1 = new System.Windows.Forms.Button();
        this.button2 = new System.Windows.Forms.Button();
        this.SuspendLayout();
        //
        // button1
        //
        this.button1.Location = new System.Drawing.Point(32, 24);
        this.button1.Name = "button1";
        this.button1.TabIndex = 0;
        this.button1.Text = "button1";
        this.button1.Click += new System.EventHandler(this.button1_Click);
        //
        // button2
        //
        this.button2.Location = new System.Drawing.Point(32, 64);
        this.button2.Name = "button2";
        this.button2.TabIndex = 0;
        this.button2.Text = "button2";
        this.button2.Click += new System.EventHandler(this.button2_Click);
        //
        // TestForm1
        //
        this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
        this.ClientSize = new System.Drawing.Size(292, 266);
        this.Controls.Add(this.button1);
        this.Controls.Add(this.button2);
        this.Name = "TestForm1";
        this.Text = "TestForm1";
        this.ResumeLayout(false);
        }
        #endregion
        private void button1_Click(object sender, System.EventArgs e) {
        IntPtr hwnd_win ;
        IntPtr hwnd_button ;
        hwnd_win = FindWindow("WindowsForms10.Window.8.app3","Form1");
        hwnd_button = FindWindowEx(hwnd_win ,new IntPtr(0) ,"WindowsForms10.BUTTON.app3","button1");
        const int BM_CLICK = 0x00F5;
        Message msg = Message.Create(hwnd_button ,BM_CLICK ,new IntPtr(0),new IntPtr(0));
        PostMessage(msg.HWnd ,msg.Msg ,msg.WParam ,msg.LParam);
        }
        private void button2_Click(object sender, System.EventArgs e) {
        const int WM_CHAR = 0x0102;
        IntPtr hwnd_win ;
        IntPtr hwnd_textbox ;
        hwnd_win = FindWindow("WindowsForms10.Window.8.app3","Form1");
        hwnd_textbox = FindWindowEx(hwnd_win ,new IntPtr(0) ,"WindowsForms10.EDIT.app3","textBox1");
        string strtext = "测试aaa";
        UnicodeEncoding encode = new UnicodeEncoding();
        char[] chars = encode.GetChars(encode.GetBytes(strtext));
        Message msg ;
        foreach (char c in chars ) {
        msg = Message.Create(hwnd_textbox ,WM_CHAR ,new IntPtr(c),new IntPtr(0));
        PostMessage(msg.HWnd ,msg.Msg ,msg.WParam ,msg.LParam);
        }
        }
        [DllImport("user32.dll")]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
        [DllImport("user32.dll")]
        public static extern IntPtr FindWindowEx(IntPtr hwndParent,IntPtr hwndChildAfter,string lpszClass,string lpszWindow);
        [DllImport("user32.dll",CharSet=CharSet.Unicode)]
        public static extern IntPtr PostMessage(IntPtr hwnd,int wMsg,IntPtr wParam,IntPtr lParam);
        }    以上代码可以在VS.NET中编译运行,也可以使用csc.exe编译,如使用一下命令行:    F:>csc.exe Form1.cs    F:>csc.exe TestForm1.cs    编译后生成两个.exe文件。    首先运行第一个程序,显示Form1窗体,然后运行第二个程序,显示TestForm1窗体。    在TestForm1窗体上点击button1按钮(向Form1窗体上的button1发送消息)此时显示对话框提示“This is button1 click!”。    在TestForm1窗体上点击button2按钮(向Form1窗体上的textBox1发送消息)此时在Form1上的textBox1上显示“测试aaa”。
      

  5.   

            
    发送端public struct CopyDataStruct
            {
                public IntPtr dwData;
                public int cbData;            [MarshalAs(UnmanagedType.LPStr)]
                public string lpData;
            }          [DllImport("User32.dll")]
            public static extern int SendMessage(int hWnd, uint Msg, int wParam, ref CopyDataStruct lParam);        private const int WM_COPYDATA = 0x004A;        [DllImport("User32.dll")]
            private static extern int FindWindow(string lpClassName, string lpWindowName);         private void button1_Click(object sender, EventArgs e)
            {
                string strURL = "http://hi.csdn.net/zenghd";
                CopyDataStruct cds;
                cds.dwData = (IntPtr)1;
                cds.lpData = strURL;
                cds.cbData = System.Text.Encoding.Default.GetBytes(strURL).Length + 1;  
                SendMessage(FindWindow(null,"B" ), WM_COPYDATA, 0, ref cds);   // 这里要修改成接收窗口的标题
            }接收端:
            public struct CopyDataStruct
            {
                public IntPtr dwData;
                public int cbData;            [MarshalAs(UnmanagedType.LPStr)]
                public string lpData;
            }          private const int WM_COPYDATA = 0x004A;
            protected override void WndProc(ref System.Windows.Forms.Message e)
            {
                if (e.Msg == WM_COPYDATA)
                {
                    CopyDataStruct cds = (CopyDataStruct)e.GetLParam(typeof(CopyDataStruct));
                    MessageBox.Show(cds.lpData);
                }            base.WndProc(ref e);
            } 
      

  6.   

    首先,在发送方,用FindWindow找到接受方的句柄,然后向接受方发送WM_COPYDATA消息。 
    接受方在DefWndProc事件中处理这条消息。由于中文编码是两个字节, 所以传递中文时候字节长度要搞清楚。 
    protected override void DefWndProc(ref  System.Windows.Forms.Message m)
    {
        switch (m.Msg)
        {
        case WinMessageUtil.WM_COPYDATA:
            string str = WinMessageUtil.ReceiveMessage(ref m);
            break;
        default:
            break;
        }
        base.DefWndProc(ref  m);
    }using System;
    using System.Runtime.InteropServices;
    using System.Diagnostics;namespace Speeding.Util
    {
        //WM_COPYDATA消息所要求的数据结构
        public struct CopyDataStruct
        {
            public IntPtr dwData;
            public int cbData;        [MarshalAs(UnmanagedType.LPStr)]
            public string lpData;
        }    /// <summary>
        /// 本类封装了一些进程间通讯的细节
        /// </summary>
        public class WinMessageUtil
        {
            public const int WM_COPYDATA = 0x004A;        //通过窗口的标题来查找窗口的句柄
            [DllImport("User32.dll", EntryPoint = "FindWindow")]
            private static extern int FindWindow(string lpClassName, string lpWindowName);        //在DLL库中的发送消息函数
            [DllImport("User32.dll", EntryPoint = "SendMessage")]
            private static extern int SendMessage
                (
                int hWnd,                        // 目标窗口的句柄  
                int Msg,                        // 在这里是WM_COPYDATA
                int wParam,                    // 第一个消息参数
                ref  CopyDataStruct lParam        // 第二个消息参数
                );        /// <summary>
            /// 发送消息,只能传递一个自定义的消息ID和消息字符串,想传一个结构,但没成功
            /// </summary>
            /// <param name="destProcessName">目标进程名称,如果有多个,则给每个都发送</param>
            /// <param name="msgID">自定义数据,可以通过这个来决定如何解析下面的strMsg</param>
            /// <param name="strMsg">传递的消息,是一个字符串</param>
            public static void SendMessage(string destProcessName, int msgID, string strMsg)
            {
                if (strMsg == null)
                    return;            //按进程名称查找,同名称的进程可能有许多,所以返回的是一个数组
                Process[] foundProcess = Process.GetProcessesByName(destProcessName);
                foreach (Process p in foundProcess)
                {
                    int toWindowHandler = p.MainWindowHandle.ToInt32();
                    if (toWindowHandler != 0)
                    {
                        CopyDataStruct cds;
                        cds.dwData = (IntPtr) msgID;   //这里可以传入一些自定义的数据,但只能是4字节整数      
                        cds.lpData = strMsg;            //消息字符串
                        cds.cbData = System.Text.Encoding.Default.GetBytes(strMsg).Length + 1;  //注意,这里的长度是按字节来算的                    //发送方的窗口的句柄, 由于本系统中的接收方不关心是该消息是从哪个窗口发出的,所以就直接填0了
                        int fromWindowHandler = 0;
                        SendMessage(toWindowHandler, WM_COPYDATA, fromWindowHandler, ref  cds);
                    }
                }
            }        /// <summary>
            /// 接收消息,得到消息字符串
            /// </summary>
            /// <param name="m">System.Windows.Forms.Message m</param>
            /// <returns>接收到的消息字符串</returns>
            public static string ReceiveMessage(ref  System.Windows.Forms.Message m)
            {
                CopyDataStruct cds = (CopyDataStruct) m.GetLParam(typeof(CopyDataStruct));
                return cds.lpData;
            }
        }
    }
      

  7.   

    不是很懂 顶一下!
    PowerNote 旨为便捷生活!