阻止应用运行两次,而是显示第一个窗口
本文关键字:显示 窗口 第一个 两次 应用 运行 | 更新日期: 2023-09-27 18:35:13
我有一个 wpf 应用程序,我必须使该应用程序只运行一次。一台计算机上不应有多个实例。
这是我在 App.xaml.cs 中的 OnStartup() 方法中的代码:
var runningProcess = GetAnotherAppInstanceIfExists();
if (runningProcess != null)
{
HandleMultipleInstances(runningProcess);
Environment.Exit(0);
}
public Process GetAnotherAppInstanceIfExists()
{
var currentProcess = Process.GetCurrentProcess();
var appProcesses = new List<string> { "myApp", "myApp.vshost" };
var allProcesses = Process.GetProcesses();
var myAppProcess = (from process in allProcesses
where process.Id != currentProcess.Id && appProcesses.Contains(process.ProcessName)
select process).FirstOrDefault();
if (myAppProcess != null)
{
return currentProcess;
}
return myAppProcess;
}
public void HandleMultipleInstances(Process runningProcess)
{
SetForegroundWindow(runningProcess.MainWindowHandle);
ShowWindow(runningProcess.MainWindowHandle, SW_RESTORE);
}
因此,该应用程序在第二次运行时不会打开新实例,这很棒。但是,我需要找到第一个实例并再次显示窗口(如果它被最小化)。这一行是针对此的:
ShowWindow(runningProcess.MainWindowHandle, SW_RESTORE);
而且它不起作用。我做错了什么?我在网上看了很多例子,我的代码和它们是一样的。
首先将 App.xaml 文件的生成操作更改为 Page。然后,您可以在 App.xaml 中使用此代码片段.cs:
private static readonly Mutex Mutex = new Mutex(true, "put your unique value here or GUID");
private static MainWindow _mainWindow;
[STAThread]
static void Main()
{
if (Mutex.WaitOne(TimeSpan.Zero, true))
{
var app = new App();
_mainWindow = new MainWindow();
app.Run(_mainWindow);
Mutex.ReleaseMutex();
}
else
{
//MessageBox.Show("You can only run one instance!");
_mainWindow.WindowState = WindowState.Maximized;
}
}
对我来说
,解决方案是这样做:
将App.xaml
文件的构建操作更改为 Page。(右键单击该文件,然后properties
=> Build Action
=> 下拉列表到page
)
在 App.xaml.cs:
private static readonly Mutex Mutex = new Mutex(true, "42ae83c2-03a0-472e-a2ea-41d69524a85b"); // GUI can be what you want !
private static App _app;
[STAThread]
static void Main()
{
if (Mutex.WaitOne(TimeSpan.Zero, true))
{
_app = new App();
_app.InitializeComponent();
_app.Run();
Mutex.ReleaseMutex();
}
else
{
//MessageBox.Show("You can only run one instance!");
_app.MainWindow.WindowState = WindowState.Maximized;
}
}