没有打开时,就打开一个;如果打开了,再次双击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" process
if (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();
}
//以上代码放在插件控件的事件里面
}