当前位置:编程学习 > C#/ASP.NET >>

如何实现只运行程序的一个实例,并且由此实例负责以后关联文件的打开?

RT
类似于MP3播放器,点击不同mp3文件,不会弹出多个实例,单只有一个窗体负责处理。
--------------------编程问答-------------------- 用 Process.GetProcessesByName() 方法查找是否已经打开了程序。 如果打开了,激活之即可。 --------------------编程问答-------------------- 谢谢楼上的回答, 
但Process.GetProcessesByName() 方法只能检测进程中该ID的程序是否存在,
现在的问题是如果存在了一个之前打开的实例,那么如何把这次双击的文件名发送给它。
所以请问楼上的“激活之”是怎么办到的? --------------------编程问答-------------------- 激活就是让他获得焦点,到前台来显示

引用 2 楼 damdam91 的回复:
谢谢楼上的回答,
但Process.GetProcessesByName() 方法只能检测进程中该ID的程序是否存在,
现在的问题是如果存在了一个之前打开的实例,那么如何把这次双击的文件名发送给它。
所以请问楼上的“激活之”是怎么办到的?
--------------------编程问答-------------------- 是我的问题没有讲清楚吗???
是我的问题没有讲清楚吗???
--------------------编程问答-------------------- 当前正在放mp3,我双击一另一个mp3文件,当前实例播放的mp3立即停止,播放新文件。
怎样接受后来打开的文件呢, 如何把第二次双击的文件名发送给第一个实例。 --------------------编程问答-------------------- #region   确保只有一个实例
        public static Process RunningInstance()
        {
            Process current = Process.GetCurrentProcess();
            Process[] processes = Process.GetProcessesByName(current.ProcessName);
            //遍历与当前进程名称相同的进程列表   
            foreach (Process process in processes)
            {
                //Ignore   the   current   process   
                if (process.Id != current.Id)
                {
                    //Make   sure   that   the   process   is   running   from   the   exe   file.   
                    if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == current.MainModule.FileName)
                    {
                        //Return   the   other   process   instance.   
                        return process;
                    }
                }
            }
            return null;
        }
        public static void HandleRunningInstance(Process instance)
        {
            // MessageBox.Show("该应用系统已经在运行!", "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information);
            ShowWindowAsync(instance.MainWindowHandle, 1);   //调用api函数,正常显示窗口   
            SetForegroundWindow(instance.MainWindowHandle);   //将窗口放置最前端。   
        }
        [DllImport("User32.dll")]
        private static extern bool ShowWindowAsync(System.IntPtr hWnd, int cmdShow);
        [DllImport("User32.dll")]
        private static extern bool SetForegroundWindow(System.IntPtr hWnd);
        #endregion

调用:
Process instance = RunningInstance();
                if (instance == null)
                {
                  //打开程序
                }
                else
                {
                    HandleRunningInstance(instance);
                } --------------------编程问答--------------------
引用 4 楼 damdam91 的回复:
是我的问题没有讲清楚吗???
是我的问题没有讲清楚吗???

给打开的实例动态传递参数 --------------------编程问答-------------------- 播放器有一个有一个关联文件类型在注册表里吧
--------------------编程问答-------------------- 地址: zgke博客 


文件关联参考 
http://blog.csdn.net/zgke/archive/2008/12/19/3557016.aspx 

保持同一个进程参考 
http://blog.csdn.net/zgke/archive/2009/07/29/4390545.aspx 
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,