pepero pepero - 11 months ago 89
C# Question

Run one instance of program

i have one problem with this ?!
i use this way for run only one instance of program.
it's do very good.but when i use this way in other app .
when i run one of them programs via shortcut from desktop , both programs invoke and show in desktop.
note : both programs run in windows system try .

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

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

static void Main()
//Application.Run(new Form1());

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


var mainForm = new Form1c();


mainForm.Visible = false;

mainForm.WindowState = FormWindowState.Normal;

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



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


//---------------- in main form

protected override void WndProc(ref Message M_C)

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

private void ShowMe()

if (WindowState == FormWindowState.Minimized)
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;


Answer Source

This is already well supported by the .NET Framework. You want to use the WindowsFormsApplicationBase class. Set the IsSingleInstance property to true. You can override the OnStartupNextInstance method to do anything you like when another instance gets started. Like restoring the window of the first instance. Rewrite your Program.cs file to look like this:

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

namespace WindowsFormsApplication1 {
    class Program : WindowsFormsApplicationBase {
        static void Main(string[] args) {
            var app = new Program();
        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;