首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

c# 两个exe怎么传递参数

2012-02-15 
c# 两个exe如何传递参数?我有两个exe都在运行中,分别为a.exe和b.exe当点击a.exe的一个按钮时,需要给b.exe

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

[解决办法]
不如把a做成dll吧..
[解决办法]
如果用a.exe去启动b.exe的话,可以使用
 System.Diagnostics.Process.Start(b.exe","这里是要传过去的参数");
[解决办法]
SendMessagae
WM_COPYDATA
[解决办法]
这个就要看楼主的具体需求了,我提供一个思路吧


1。如果是在a.exe中的某按钮点击时启动b.exe,则可以通过process进程类的argumens直接传递;

2。若是两个exe都在运行过程中,则楼主所说的情况就是常见的两个进程之间互相通信的情况了。对于这个我常常是用windows api来实现,就是在a.exe中调用findWindow与sendMessage两个api函数来发送相应的消息,而b.exe重写窗口的消息处理方法来对消息进行判断处理

[解决办法]
第一个项目包含一个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”。


[解决办法]

C# code
     
发送端

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


热点排行