我写了一个C#程序,这个程序是由另外的程序调用的,并且会传递参数给它,这个程序只能在内存中存在一个,如果程序没有运行则启动它,如果程序已经在运行,则将程序置为当前在运行的程序,就像Excel一样,并且会得到最新参数,如何实现呢,希望高手给与提示.

解决方案 »

  1.   

    以前做COM的时候做过,
    大概就是 做个EXE型的COM服务器,在EXE中输出COM接口,其他的程序通过调用这个COM接口跟EXE交互
      

  2.   


    System.Diagnostics.Process.Start(@"要启动的程序路径", @"命令行参数, 以空格分开");
      

  3.   

    比较简单...以上代码是启动程序并传入参数...然后在目标程序的Main方法中处理args参数数组就可以了(哪94您传入的)...如果程序已经启动, 哪也很好办, 直接用API->SendMessage通知一声比较方便...^o^
      

  4.   

    这个问题我暂时解决,先判断进程
     Process currentProcess = System.Diagnostics.Process.GetCurrentProcess();
                Process[] ProcessAry = System.Diagnostics.Process.GetProcessesByName(currentProcess.ProcessName);            IntPtr mainPtr;            foreach (Process p in ProcessAry)
                {
                    if (p.Id!=currentProcess.Id)
                    {
                        mainPtr = p.MainWindowHandle;                    byte[] bytes = System.Text.Encoding.UTF8.GetBytes(arg);
                        int length = bytes.Length;                    COPYDATASTRUCT copyData = new COPYDATASTRUCT();
                        copyData.dwData = (IntPtr)1;
                        copyData.lpData = arg;
                        copyData.cbData = length + 1;                    User32.SendMessage(mainPtr, User32.WM_COPYDATA, 0, ref copyData);
                        return;
                    }
                }如果进程存在得到主窗体句柄,然后把得到的参数消息发送给窗体就可以了
    protected override void WndProc(ref Message m)
            {
                switch (m.Msg)
                {
                    case User32.WM_COPYDATA:
                        COPYDATASTRUCT copyData = new COPYDATASTRUCT();
                        copyData = (COPYDATASTRUCT)m.GetLParam(copyData.GetType());
                        AppGlobal.AnalysePara(copyData.lpData);
                        if (this.WindowState == FormWindowState.Minimized)
                            this.WindowState = FormWindowState.Normal;
                        this.Activate();
                        this.txtFoler.Text = AppGlobal.Folder;
                        break;
                    default:                    base.WndProc(ref m);
                        break;
                }
            }
    然后就OK了 结帖