当程序有一个实例运行后,如果再次运行此程序,则调用原选创建的程序,且将参数传递给原先的程序,有什么方法吗?google了一下午,终究没有找到.
 static class Program
    {
        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool SetForegroundWindow(IntPtr hWnd);
        [STAThread]
        static void Main(string[] path)
        {
            Process anotherProcess = RuningInstance();
            if (anotherProcess != null)
            {
                System.Windows.Forms.MessageBox.Show("己有实例在运行!");
                //此处调用己运行的程序,且将path传递给它.
                Application.Exit();
            }
            else
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
                MainFrm1 mf1 = new MainFrm1();
                mainFrm mf = new mainFrm();
                if (path.Length != 0)
                    mf1._TxtFilePath = path[0];
                Application.Run(mf1);
            }
        }        static Process RuningInstance()
        {
            Process current = Process.GetCurrentProcess();
            Process[] processes = Process.GetProcessesByName(current.ProcessName);
            foreach (Process p in processes)
            {
                if (p.Id != current.Id)
                {
                    //确认相同进程的程序运行位置是否一样. 
                    if (System.Reflection.Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
                    {
                        //Return the other process instance. 
                        return p;
                    }
                }
            }
            //No other instance was found, return null. 
            return null; 
        }
    }

解决方案 »

  1.   

    http://www.itpub.net/thread-1190443-1-1.html#
      

  2.   


    Mutex可以实现单一实例
    想要把那个参数传递过去,还要多费点脑筋
      

  3.   

      ///<summary>
            ///应用程序的主入口点。
            ///</summary>
            [STAThread]
            staticvoid Main()
            {
                //防止程序多次运行
                if(!OneInstance.IsFirst("GetPayInfo"))
                {
                    MessageBox.Show ("警告:程序正在运行中! 请不要重复打开程序!可在右下角系统栏找到!","程序错误提示:",MessageBoxButtons.OK,MessageBoxIcon.Stop);
                    return;
                }
                Application.Run(new Form1());
            }
            // ******************* 防止程序多次执行 **************************
            publicabstractclass OneInstance
            {
                ///<summary>
                ///判断程序是否正在运行
                ///</summary>
                ///<param name="appId">程序名称</param>
                ///<returns>如果程序是第一次运行返回True,否则返回False</returns>
                publicstaticbool IsFirst(string appId)
                {
                    bool ret=false;
                    if(OpenMutex(0x1F0001,0,appId)==IntPtr.Zero)
                    {
                        CreateMutex(IntPtr.Zero,0,appId);
                        ret=true;
                    }
                    return ret;
                }  
                [DllImport("Kernel32.dll",CharSet=CharSet.Auto)]
                privatestaticextern IntPtr OpenMutex(
                    uint dwDesiredAccess, // access
                    int bInheritHandle,    // inheritance option
                    string lpName          // object name
                    );
     
                [DllImport("Kernel32.dll",CharSet=CharSet.Auto)]
                privatestaticextern IntPtr CreateMutex(
                    IntPtr lpMutexAttributes, // SD
                    int bInitialOwner,                       // initial owner
                    string lpName                            // object name
                    );
            }
      

  4.   

    用SendMessage吧,既然已经找到对方窗口了,自定义一个消息值,附带参数
      

  5.   

    自己注册一个消息,然后启动后先广播这个消息(使用BroadcastSystemMessage),wparam设置为自己的句柄,lparam设置为自己空间里一个指针,里面有进程得到的启动参数.你自己的程序的主消息循环里才知道有这个自定义的消息,响应之,并与发送者的句柄通讯,此时就能得知是否已有实例在运行了.如果有,则使用readprocessmemory得到这个启动参数.然后自己退出.
      

  6.   

    己解决。感谢各位回答。附源码,供后来者参考:
    Program.cs
     [DllImport("user32.dll")]
            [return: MarshalAs(UnmanagedType.Bool)]
            static extern bool SetForegroundWindow(IntPtr hWnd);
            [STAThread]
            static void Main(string[] path)
            {
                Process anotherProcess = RuningInstance();
                if (anotherProcess != null&&path.Length!=0)
                {
                    //System.Windows.Forms.MessageBox.Show("己有实例在运行!");
                    string formName = anotherProcess.MainWindowTitle;
                    SendMessage(formName, path);
                    Application.Exit();
                }
                else
                {
                    Application.EnableVisualStyles();
                    Application.SetCompatibleTextRenderingDefault(false);
                    MainFrm1 mf1 = new MainFrm1();
                    mainFrm mf = new mainFrm();
                    if (path.Length != 0)
                        mf1._TxtFilePath = path[0];
                    Application.Run(mf1);
                }
            }        static void SendMessage(string formName,string[] args )
            {
                int hPdf = IPCTool.FindWindow(null, @formName);
                if (hPdf != 0)
                {
                    IPCTool.COPYDATASTRUCT cds;
                    cds.dwData = (IntPtr)256;
                    cds.lpData = args[0];
                    cds.cbData = 256;
                    IPCTool.SendMessage(hPdf, 0x004A, 0, ref cds);
                }
                /*
                    LRESULT SendMessage(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM IParam);
                 * hWnd:其窗口程序将接收消息的窗口的句柄。如果此参数为HWND_BROADCAST,则消息将被发送到系统中所有顶层窗口,包括无效或不可见的非自身拥有的窗口、被覆盖的窗口和弹出式窗口,但消息不被发送到子窗口。
                 * Msg:指定被发送的消息。 
                 * wParam:指定附加的消息指定信息。 
                 * IParam:指定附加的消息指定信息。 
                 * 返回值:返回值指定消息处理的结果,依赖于所发送的消息。 
                 * 备注:需要用HWND_BROADCAST通信的应用程序应当使用函数RegisterWindowMessage来为应用程序间的通信取得一个唯一的消息。 
                 */
            }        static Process RuningInstance()
            {
                Process current = Process.GetCurrentProcess();
                Process[] processes = Process.GetProcessesByName(current.ProcessName);
                foreach (Process p in processes)
                {
                    if (p.Id != current.Id)
                    {
                        //确认相同进程的程序运行位置是否一样. 
                        if (System.Reflection.Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
                        {
                            //Return the other process instance. 
                            return p;
                        }
                    }
                }
                //No other instance was found, return null. 
                return null; 
            }    }
    IPCTool.cs
    public struct COPYDATASTRUCT
            {
                public IntPtr dwData;
                public int cbData;
                [MarshalAs(UnmanagedType.LPStr)]
                public string lpData;
            }        [DllImport("User32.dll", EntryPoint = "SendMessage")]
            public static extern int SendMessage(
             int hWnd, //目标窗口的handle
             int Msg, // 消息
             int wParam, // 第一个消息参数
             ref COPYDATASTRUCT lParam // 第二个消息参数
             );        [DllImport("User32.dll", EntryPoint = "FindWindow")]
            public static extern int FindWindow(string lpClassName, string
             lpWindowName);        const int WM_COPYDATA = 0x004A;