如何创建单个实例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