c# - 运行一个程序实例

标签 c#

我有一个问题?! 我用这种方式只运行一个程序实例。 它做得很好。但是当我在其他应用程序中使用这种方式时。 当我通过桌面快捷方式运行其中一个程序时,两个程序都会调用并显示在桌面上。 注意:两个程序都在windows系统下运行试试。

    static bool ok;
    static Mutex mutex = new Mutex(true, "{123Newsoft-Cleaner Portable Program123}",out ok);

    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]

    static void Main()
    {
        //Application.EnableVisualStyles();
        //Application.SetCompatibleTextRenderingDefault(false);
        //Application.Run(new Form1());

        if (mutex.WaitOne(TimeSpan.Zero, true))  
        {

            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);


            var mainForm = new Form1c();

            try
            {                                    

                    mainForm.Visible = false;


                    mainForm.WindowState = FormWindowState.Normal;                  

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

            Application.Run(mainForm);               

        }
        else
        {

            NativeMethods.PostMessage((IntPtr)NativeMethods.HWND_BROADCAST, NativeMethods.WM_SHOWME, IntPtr.Zero, IntPtr.Zero);

        }

//----------------主要形式

    protected override void WndProc(ref Message M_C)
    {

        if (M_C.Msg == NativeMethods.WM_SHOWME)
        {               
            ShowMe();
        }
        base.WndProc(ref M_C);
    }

    //*************
    private void ShowMe()
    {

        if (WindowState == FormWindowState.Minimized)
        {
            Show();
            WindowState = FormWindowState.Normal;
        }

        // get our current "TopMost" value (ours will always be false though)
        bool top = TopMost;
        // make our form jump to the top of everything
        TopMost = true;
        // set it back to whatever it was
        TopMost = top;

    }  

最佳答案

.NET Framework 已经很好地支持了这一点。您想要使用 WindowsFormsApplicationBase 类。将 IsSingleInstance 属性设置为 true。您可以覆盖 OnStartupNextInstance 方法,以便在另一个实例启动时执行您喜欢的任何操作。就像恢复第一个实例的窗口一样。重写您的 Program.cs 文件,使其看起来像这样:

using System;
using System.Windows.Forms;
using Microsoft.VisualBasic.ApplicationServices;   // Add reference to Microsoft.VisualBasic

namespace WindowsFormsApplication1 {
    class Program : WindowsFormsApplicationBase {
        [STAThread]
        static void Main(string[] args) {
            var app = new Program();
            app.Run(args);
        }
        public Program() {
            this.IsSingleInstance = true;
            this.EnableVisualStyles = true;
            this.MainForm = new Form1();
        }
        protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs) {
            if (this.MainForm.WindowState == FormWindowState.Minimized) this.MainForm.WindowState = FormWindowState.Normal;
            this.MainForm.Activate();
        }
    }
}

关于c# - 运行一个程序实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11923785/

相关文章:

c# - MySql 中的日期类型

c# - 使用 WPF 动态加载内容

c# - "Download all"选项可供用户使用 Html.ActionLink

c# - 在两个列表之间相交不起作用

c# - Elasticsearch NEST PUT 映射以添加字段/属性

c# - "Realistic"乒乓球碰撞

c# - WCF 应用端点

c# - 当代码块结束时,var 类型会发生什么?

c# - 如何在 wp7 的隔离存储中存储整数值?

c# - DateTime.Now 是衡量函数性能的最佳方式吗?