可先检测进程列表中是否有你要的程序,没有就启动。Process.Start传递数据可以用WM_COPYDATA消息。

解决方案 »

  1.   

    这个问题,非常困难
    如果在进程之间传递一些整数之类的东西还算比较容易,用Windows消息就可以完全胜任。但,如果要在进程之间传递字符串,目前没有什么值得称是的办法。
    .net不能很好地支持内存地址传递,因为它的变量地址是动态的。目前可行的办法就是用Remoting技术。它的系统开销、性能损失是较大的。
      

  2.   

    用api,FindWindowEx(),FindWindow(),然后发送消息;
      

  3.   

    进程之间通讯的几种方法:  
     
    在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯。常用的方法有  
     
    使用内存映射文件  
    通过共享内存DLL共享内存  
    使用SendMessage向另一进程发送WM_COPYDATA消息  
     
    比起前两种的复杂实现来,WM_COPYDATA消息无疑是一种经济实惠的一中方法.  
     
    WM_COPYDATA消息的主要目的是允许在进程间传递只读数据。Windows在通过WM_COPYDATA消息传递期间,不提供继承同步方式。SDK文档推荐用户使用SendMessage函数,接受方在数据拷贝完成前不返回,这样发送方就不可能删除和修改数据:  
     
    这个函数的原型及其要用到的结构如下:  
     
    SendMessage(hwnd,WM_COPYDATA,wParam,lParam);    
    其中,WM_COPYDATA对应的十六进制数为0x004A  
     
    wParam设置为包含数据的窗口的句柄。lParam指向一个COPYDATASTRUCT的结构:  
    typedef  struct  tagCOPYDATASTRUCT{  
    DWORD  dwData;//用户定义数据  
    DWORD  cbData;//数据大小  
    PVOID  lpData;//指向数据的指针  
    }COPYDATASTRUCT;  
    该结构用来定义用户数据。  
     
    具体过程如下:  
     
     
    首先,在发送方,用FindWindow找到接受方的句柄,然后向接受方发送WM_COPYDATA消息.  
     
    接受方在DefWndProc事件中,来处理这条消息.由于中文编码是两个字节,所以传递中文时候字节长度要搞清楚.  
     
    体代码如下:  
    //---------------------------------------------------  
    //发送方:  
    using  System;  
    using  System.Drawing;  
    using  System.Collections;  
    using  System.ComponentModel;  
    using  System.Windows.Forms;  
    using  System.Data;  
    using  System.Runtime.InteropServices;  
     
    namespace  WinFormSendMsg  
    {  
    public  class  Form1  :  System.Windows.Forms.Form  
    {  
    private  System.Windows.Forms.TextBox  textBox1;  
    private  System.Windows.Forms.Button  button1;  
    private  System.ComponentModel.Container  components  =  null;  
    const  int  WM_COPYDATA  =  0x004A;  
    public  Form1()  
    {  
    InitializeComponent();  
    }  
     
    protected  override  void  Dispose(  bool  disposing  )  
    {  
    if(  disposing  )  
    {  
    if  (components  !=  null)    
    {  
    components.Dispose();  
    }  
    }  
    base.Dispose(  disposing  );  
    }  
     
     
    private  void  InitializeComponent()  
    {  
    this.textBox1  =  new  System.Windows.Forms.TextBox();  
    this.button1  =  new  System.Windows.Forms.Button();  
    this.SuspendLayout();  
    //    
    //  textBox1  
    //    
    this.textBox1.Location  =  new  System.Drawing.Point(184,  24);  
    this.textBox1.Name  =  "textBox1";  
    this.textBox1.Size  =  new  System.Drawing.Size(128,  21);  
    this.textBox1.TabIndex  =  0;  
    this.textBox1.Text  =  "textBox1";  
    //    
    //  button1  
    //    
    this.button1.Location  =  new  System.Drawing.Point(344,  16);  
    this.button1.Name  =  "button1";  
    this.button1.Size  =  new  System.Drawing.Size(112,  32);  
    this.button1.TabIndex  =  1;  
    this.button1.Text  =  "button1";  
    this.button1.Click  +=  new  System.EventHandler(this.button1_Click);  
    //    
    //  Form1  
    //    
    this.AutoScaleBaseSize  =  new  System.Drawing.Size(6,  14);  
    this.ClientSize  =  new  System.Drawing.Size(536,  142);  
    this.Controls.AddRange(new  System.Windows.Forms.Control[]  {  
    this.button1,  
    this.textBox1});  
    this.Name  =  "Form1";  
    this.Text  =  "发送方窗体";  
    this.ResumeLayout(false);  
     
    }  
     
    static  void  Main()    
    {  
    Application.Run(new  Form1());  
    }  
     
    [DllImport("User32.dll",EntryPoint="SendMessage")]  
    private  static  extern  int  SendMessage(  
    int  hWnd,  //  handle  to  destination  window  
    int  Msg,  //  message  
    int  wParam,  //  first  message  parameter  
    ref  COPYDATASTRUCT  lParam  //  second  message  parameter  
    );  
     
     
    [DllImport("User32.dll",EntryPoint="FindWindow")]  
    private  static  extern  int  FindWindow(string  lpClassName,string  
    lpWindowName);  
     
     
    private  void  button1_Click(object  sender,  System.EventArgs  e)  
    {  
    int  WINDOW_HANDLER  =  FindWindow(null,@"接收方窗体");  
    if(WINDOW_HANDLER  ==  0)  
    {  
     
    }  
    else  
    {  
    byte[]  sarr  =  System.Text.Encoding.Default.GetBytes(this.textBox1.Text);  
    int  len  =  sarr.Length;  
     
    COPYDATASTRUCT  cds;  
    cds.dwData  =  (IntPtr)  100;  
    cds.lpData  =  this.textBox1.Text;  
    cds.cbData  =  len  +  1;  
    SendMessage(WINDOW_HANDLER,  WM_COPYDATA,  0,  ref  cds);  
     
     
    }  
     
    }  
    }  
    public  struct  COPYDATASTRUCT  
    {  
    public  IntPtr  dwData;  
    public  int  cbData;  
    [MarshalAs(UnmanagedType.LPStr)]  public  string  lpData;  
    }  
     
     
    }  
     
     
    //---------------------------------------------------  
    //接受方  
    //---------------------------------------------------  
    using  System;  
    using  System.Drawing;  
    using  System.Collections;  
    using  System.ComponentModel;  
    using  System.Windows.Forms;  
    using  System.Data;  
    using  System.Runtime.InteropServices;  
     
    namespace  WindowsFormGetMsg  
    {  
    public  class  Form1  :  System.Windows.Forms.Form  
    {  
    private  System.Windows.Forms.TextBox  textBox1;  
    private  System.ComponentModel.Container  components  =  null;  
    const  int  WM_COPYDATA  =  0x004A;  
     
    public  Form1()  
    {  
    InitializeComponent();  
    }  
     
    protected  override  void  Dispose(  bool  disposing  )  
    {  
    if(  disposing  )  
    {  
    if  (components  !=  null)    
    {  
    components.Dispose();  
    }  
    }  
    base.Dispose(  disposing  );  
    }  
    private  void  InitializeComponent()  
    {  
    this.textBox1  =  new  System.Windows.Forms.TextBox();  
    this.SuspendLayout();  
    //    
    //  textBox1  
    //    
    this.textBox1.Location  =  new  System.Drawing.Point(176,  32);  
    this.textBox1.Name  =  "textBox1";  
    this.textBox1.Size  =  new  System.Drawing.Size(160,  21);  
    this.textBox1.TabIndex  =  0;  
    this.textBox1.Text  =  "textBox1";  
    //    
    //  Form1  
    //    
    this.AutoScaleBaseSize  =  new  System.Drawing.Size(6,  14);  
    this.ClientSize  =  new  System.Drawing.Size(432,  266);  
    this.Controls.AddRange(new  System.Windows.Forms.Control[]  {  
    this.textBox1});  
    this.Name  =  "Form1";  
    this.Text  =  "接收方窗体";  
    this.ResumeLayout(false);  
     
    }  
    static  void  Main()    
    {  
    Application.Run(new  Form1());  
    }  
     
    protected  override  void  DefWndProc(ref  System.Windows.Forms.Message  m)  
    {  
    switch(m.Msg)  
    {  
    case  WM_COPYDATA:  
    COPYDATASTRUCT  mystr  =  new  COPYDATASTRUCT();  
    Type  mytype  =  mystr.GetType();  
    mystr  =(COPYDATASTRUCT)m.GetLParam(mytype);  
    this.textBox1.Text  =mystr.lpData;  
    break;  
    default:  
    base.DefWndProc(ref  m);  
    break;  
     
    }  
     
    }  
     
    }  
     
    public  struct  COPYDATASTRUCT  
    {  
    public  IntPtr  dwData;  
    public  int  cbData;  
    [MarshalAs(UnmanagedType.LPStr)]  public  string  lpData;  
    }  
    }  
     
      

  4.   

    以上是我从FAQ中抄的:
    http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=195720