没有打开时,就打开一个;如果打开了,再次双击exe后,已打开的窗体就前置;如果窗体已经打开并最小化,就还原窗体并前置!
windowns窗体应用项目:
//以下所有代码放在窗体的Program.cs里面[DllImport("user32.dll")]private static extern bool SetForegroundWindow(IntPtr hWnd);[DllImport("user32.dll")]private static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);[DllImport("user32.dll")]private static extern bool IsIconic(IntPtr hWnd);private const int SW_RESTORE = 9;/// <summary>/// c# 进程窗口显示并前置/// </summary>public static void RaiseOtherProcess(){Process proc = Process.GetCurrentProcess();Process.GetProcesses();foreach (Process otherProc in Process.GetProcessesByName(proc.ProcessName)){//ignore "this" processif (proc.Id != otherProc.Id){// Found a "same named process".// Assume it is the one we want brought to the foreground.// Use the Win32 API to bring it to the foreground.IntPtr hWnd = otherProc.MainWindowHandle;if (IsIconic(hWnd)){ShowWindowAsync(hWnd, 9);}SetForegroundWindow(hWnd);break;}}}static void Main(){Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);bool createdNew = new bool();Mutex instance = new Mutex(true, "Regfrm", out createdNew);if (createdNew){Application.Run(new Regfrm());instance.ReleaseMutex();//如果需要窗体重启,并出现问题,将这句改为//instance.Dispose();}else{RaiseOtherProcess();Application.Exit();}}
=====================================
windowns窗体应用插件项目:
public Form frm;//这一句放在class里面private void Button1_Click(object sender, RibbonControlEventArgs e){//以下代码放在插件控件的事件里面if (frm == null || frm.IsDisposed){frm = new Mainfrm();frm.Show();}else{if (frm.WindowState == FormWindowState.Minimized){frm.WindowState = FormWindowState.Normal;}frm.Activate();}//以上代码放在插件控件的事件里面}
