如何创建单个实例WPF应用程序在尝试打开另一个实例时还原打开的窗口?

对不起,标题很难理解。 我不确定如何说出来。

我有一个应用程序,只允许每个用户会话运行一个实例。 如果用户再次单击以启动应用程序,我希望将该应用程序重点关注。

该窗口可能具有折叠的可见性。

如果它可见,我知道我可以使用

if (IsIconic(hWnd)) { ShowWindowAsync(hWnd, swRestore); } SetForegroundWindow(hWnd); 

但是如果窗户倒塌了,有没有办法让我把它带回来?

你正在寻找Mutex Class 。 这很复杂,但幸运的是,Singleton模式已被广泛讨论。 有几篇很好的文章,但您可以在Sanity Free Coding网站的C#.NET单实例应用程序页面中找到它的一个很好的实现。 从链接页面:

 static class Program { static Mutex mutex = new Mutex(true, "{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}"); [STAThread] static void Main() { if(mutex.WaitOne(TimeSpan.Zero, true)) { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); mutex.ReleaseMutex(); } else { MessageBox.Show("only one instance at a time"); } } } 

现在你可能想知道如何在WPF应用程序中使用Main方法,对吧? 那么你需要做的一些事情,但并不困难。 请参阅为WPF应用程序编写自定义Main()方法文章,该文章详细解释了这一点。 从那篇文章:

您基本上需要将应用程序的构建操作从“Application Definition”更改为“Page”,创建一个调用“InitializeComponent”的构造函数,并通过最终调用应用程序的“Run”方法重载之一来编写Main()。 …也不要忘记从App.xaml中删除“StartupUri”,否则将显示另一个窗口副本(除非因为URI指向不存在的XAML资源而出现错误)。

因此,通过合并这两个资源,我们可以看到您的App.xaml.cs文件应该如下所示:

 public partial class App : Application { private static Mutex mutex = new Mutex(true, "{8F6F0AC4-B9A1-45fd-A8CF-72F04E6BDE8F}"); private static MainWindow mainWindow = null; App() { InitializeComponent(); } [STAThread] static void Main() { if(mutex.WaitOne(TimeSpan.Zero, true)) { App app = new App(); mainWindow = new MainWindow(); app.Run(mainWindow); mutex.ReleaseMutex(); } else { mainWindow.WindowState = WindowState.Normal; } } } 

我从App.xaml文件中删除了标签StartupUri

将App.xaml的Build Action从ApplicationDefinition更改为Page (您可以在属性窗口中更改它)。

添加对Microsoft.VisualBasic的引用(名称空间到WindowsFormsApplicationBase)。

App.xaml.cs类上,输入以下代码:

 public partial class App : Application { App() { InitializeComponent(); } [STAThread] static void Main() { SingleInstanceManager manager = new SingleInstanceManager(); manager.Run(new[] {"teste"}); } } public class SingleInstanceManager : WindowsFormsApplicationBase { SingleInstanceApplication app; public SingleInstanceManager() { this.IsSingleInstance = true; } protected override bool OnStartup(Microsoft.VisualBasic.ApplicationServices.StartupEventArgs e) { // First time app is launched app = new SingleInstanceApplication(); app.Run(); return false; } protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs) { // Subsequent launches base.OnStartupNextInstance(eventArgs); app.Activate(); } } public class SingleInstanceApplication : Application { protected override void OnStartup(System.Windows.StartupEventArgs e) { base.OnStartup(e); // Create and show the application's main window MainWindow window = new MainWindow(); window.Show(); } public void Activate() { // Reactivate application's main window this.MainWindow.WindowState = WindowState.Normal; this.MainWindow.Activate(); } } 

我希望它有所帮助:D