C# 当我双击Winform或Wpf的程序两次时

C# 当我双击Winform或Wpf的程序两次时,c#,wpf,winforms,single-instance,C#,Wpf,Winforms,Single Instance,如果我有一个Winform或Wpf程序,例如a.exe,我双击它,一个窗口显示,我隐藏它,然后再次双击a.exe,我如何使隐藏窗口再次显示 winform(需要1,4和5)和Wpf(需要1,2和3)的摘要: 1.SingleInstanceApplication类 2.对于App.xaml.cs中的Wpf 3.对于MainWindow.xaml.cs中的Wpf 4.对于Program.cs中的Winform 5.对于Form1.cs中的Winform 在Winforms(VB.NET)中,您可以

如果我有一个Winform或Wpf程序,例如a.exe,我双击它,一个窗口显示,我隐藏它,然后再次双击a.exe,我如何使隐藏窗口再次显示

winform(需要1,4和5)和Wpf(需要1,2和3)的摘要: 1.SingleInstanceApplication类 2.对于App.xaml.cs中的Wpf 3.对于MainWindow.xaml.cs中的Wpf 4.对于Program.cs中的Winform 5.对于Form1.cs中的Winform 在Winforms(VB.NET)中,您可以使其成为一个单实例应用程序

项目属性>应用程序>制作单实例应用程序

此选项在C#或Visual Studio的快速版中不可用,但是:

因此,这可能很有用:

您可以尝试以下方法:

static class Program
{
    [DllImport("user32.dll")]
    static extern bool SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll")]
    static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);


    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        bool createdNew = true;
        using (Mutex mutex = new Mutex(true, "SomeUniqueName", out createdNew))
        {
            if (createdNew)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                Application.Run(new MyForm());
            }
            else
            {
                Process current = Process.GetCurrentProcess();
                foreach (Process process in Process.GetProcessesByName(current.ProcessName))
                {
                    if (process.Id != current.Id)
                    {
                        SetForegroundWindow(process.MainWindowHandle);
                        ShowWindowAsync(process.MainWindowHandle, 9);    //9 == SW_RESTORE
                        break;
                    }
                }
            }
        }
    }
}
静态类程序
{
[DllImport(“user32.dll”)]
静态外部bool setforegroundindow(IntPtr hWnd);
[DllImport(“user32.dll”)]
静态外部bool ShowWindowAsync(IntPtr hWnd、intncmdshow);
/// 
///应用程序的主要入口点。
/// 
[状态线程]
静态void Main()
{
bool createdNew=true;
使用(Mutex Mutex=new Mutex(true,“SomeUniqueName”,out createdNew))
{
如果(createdNew)
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
运行(新的MyForm());
}
其他的
{
Process current=Process.GetCurrentProcess();
foreach(Process.getProcessByName(current.ProcessName))中的进程
{
if(process.Id!=current.Id)
{
SetForegroundWindow(process.MainWindowHandle);
ShowWindowAsync(process.MainWindowHandle,9);//9==SW\u RESTORE
打破
}
}
}
}
}
}

winform的想法恐怕不正确,在我的专业版VS中,只有“配置”、“平台”、“程序集名称”、“默认名称空间”、“目标框架”、“输出类型”、“仅客户端框架子集”、“启动对象”、“程序集信息”、“资源”,没有“生成单实例应用程序”@PlantainYao不确定您正在查看的内容/位置,该选项位于属性-->应用程序的右上方“关机时保存我的设置”。确保启用应用程序框架是正确的checked@Mark霍尔我刚才犯了一个错误,在C#.Net的VS中没有“生成单实例应用程序”复选框,但在VB.Net的VS中有一个复选框。
    protected override void OnStartup(StartupEventArgs e)
    {
        SingleInstanceAppliction.SetGuid("{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}");
        if (SingleInstanceAppliction.IsFirst())
        {
            base.OnStartup(e);
            SingleInstanceAppliction.ReleaseMutex();
        }
        else
        {
            SingleInstanceAppliction.PostMessage();
            Shutdown();
        }
    }
    protected override void OnSourceInitialized(EventArgs e)
    {
        base.OnSourceInitialized(e);
        var source = PresentationSource.FromVisual(this) as HwndSource;
        source.AddHook(WndProc);
    }
    private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
    {
        if (msg == SingleInstanceAppliction.WM_SHOWME)
        {
            if (WindowState == WindowState.Minimized)
            {
                WindowState = WindowState.Normal;
            }
            var top = Topmost;
            Topmost = true;
            Topmost = top;
        }
        return IntPtr.Zero;
    }
    [STAThread]
    private static void Main()
    {
        SingleInstanceAppliction.SetGuid("{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}");
        if (SingleInstanceAppliction.IsFirst())
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
            SingleInstanceAppliction.ReleaseMutex();
        }
        else
        {
            SingleInstanceAppliction.PostMessage();
        }
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
    protected override void WndProc(ref Message m)
    {
        if (m.Msg == SingleInstanceAppliction.WM_SHOWME)
        {
            if (WindowState == FormWindowState.Minimized)
            {
                WindowState = FormWindowState.Normal;
            }
            var top = TopMost;
            TopMost = true;
            TopMost = top;
        }
        base.WndProc(ref m);
    }
static class Program
{
    [DllImport("user32.dll")]
    static extern bool SetForegroundWindow(IntPtr hWnd);

    [DllImport("user32.dll")]
    static extern bool ShowWindowAsync(IntPtr hWnd, int nCmdShow);


    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        bool createdNew = true;
        using (Mutex mutex = new Mutex(true, "SomeUniqueName", out createdNew))
        {
            if (createdNew)
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);

                Application.Run(new MyForm());
            }
            else
            {
                Process current = Process.GetCurrentProcess();
                foreach (Process process in Process.GetProcessesByName(current.ProcessName))
                {
                    if (process.Id != current.Id)
                    {
                        SetForegroundWindow(process.MainWindowHandle);
                        ShowWindowAsync(process.MainWindowHandle, 9);    //9 == SW_RESTORE
                        break;
                    }
                }
            }
        }
    }
}