Skip to content

Commit b1583b6

Browse files
committed
feat: 单实例锁,重复启动时激活已有窗口
1 parent c0d1ee4 commit b1583b6

3 files changed

Lines changed: 64 additions & 33 deletions

File tree

ChuChartManager/AppMain.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
using SingleInstanceCore;
2+
13
namespace ChuChartManager;
24

3-
public partial class AppMain
5+
public partial class AppMain : ISingleInstance
46
{
57
public static Browser? BrowserWin { get; set; }
68
public static OobeBrowser? OobeBrowserWin { get; set; }
@@ -55,4 +57,19 @@ public static void CheckShouldExit()
5557
Application.Exit();
5658
}
5759
}
60+
61+
/// <summary>第二个实例启动时,把已有窗口带到前台</summary>
62+
public void OnInstanceInvoked(string[] args)
63+
{
64+
UiContext?.Post(_ =>
65+
{
66+
var win = (Form?)(BrowserWin is { IsDisposed: false } ? BrowserWin : null)
67+
?? (OobeBrowserWin is { IsDisposed: false } ? OobeBrowserWin : null);
68+
if (win == null) return;
69+
70+
if (win.WindowState == FormWindowState.Minimized)
71+
win.WindowState = FormWindowState.Normal;
72+
win.Activate();
73+
}, null);
74+
}
5875
}

ChuChartManager/ChuChartManager.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
<PackageReference Include="NAudio" Version="2.3.0" />
4343
<PackageReference Include="NAudio.Lame" Version="2.1.0" />
4444
<PackageReference Include="Pfim" Version="0.11.4" />
45+
<PackageReference Include="SingleInstanceCore" Version="2.2.2" />
4546
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.12" />
4647
<PackageReference Include="Tomlyn" Version="2.4.0" />
4748
<PackageReference Include="YAXLib" Version="2.15.0" />

ChuChartManager/Program.cs

Lines changed: 45 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,59 @@
1+
using SingleInstanceCore;
2+
13
namespace ChuChartManager;
24

35
public static class Program
46
{
57
[STAThread]
68
public static void Main()
79
{
8-
ApplicationConfiguration.Initialize();
9-
10-
Directory.CreateDirectory(StaticSettings.AppDataDir);
11-
StaticSettings.Config = Config.Load();
10+
var app = new AppMain();
11+
var isFirstInstance = app.InitializeAsFirstInstance("ChuChartManager");
12+
if (!isFirstInstance) return;
1213

13-
var hasGamePath = !string.IsNullOrEmpty(StaticSettings.Config.GamePath)
14-
&& Directory.Exists(StaticSettings.Config.GamePath);
15-
16-
if (hasGamePath)
14+
try
1715
{
18-
StaticSettings.GamePath = StaticSettings.Config.GamePath;
19-
StaticSettings.ReadGameVersion();
20-
var scanner = new MusicScanner(StaticSettings.GamePath);
21-
scanner.ScanAll();
22-
StaticSettings.Scanner = scanner;
23-
24-
AppMain.BrowserWin = new Browser();
25-
AppMain.BrowserWin.Show();
16+
ApplicationConfiguration.Initialize();
17+
18+
Directory.CreateDirectory(StaticSettings.AppDataDir);
19+
StaticSettings.Config = Config.Load();
20+
21+
var hasGamePath = !string.IsNullOrEmpty(StaticSettings.Config.GamePath)
22+
&& Directory.Exists(StaticSettings.Config.GamePath);
23+
24+
if (hasGamePath)
25+
{
26+
StaticSettings.GamePath = StaticSettings.Config.GamePath;
27+
StaticSettings.ReadGameVersion();
28+
var scanner = new MusicScanner(StaticSettings.GamePath);
29+
scanner.ScanAll();
30+
StaticSettings.Scanner = scanner;
31+
32+
AppMain.BrowserWin = new Browser();
33+
AppMain.BrowserWin.Show();
34+
}
35+
else
36+
{
37+
AppMain.OobeBrowserWin = new OobeBrowser();
38+
AppMain.OobeBrowserWin.Show();
39+
}
40+
41+
// Form.Show() 后 SynchronizationContext 才可用
42+
AppMain.UiContext = SynchronizationContext.Current;
43+
44+
ServerManager.StartApp(StaticSettings.Config.IsExport, url =>
45+
{
46+
if (AppMain.BrowserWin is { IsDisposed: false } browser)
47+
browser.Invoke(() => browser.InjectBackendUrl(url));
48+
if (AppMain.OobeBrowserWin is { IsDisposed: false } oobe)
49+
oobe.Invoke(() => oobe.InjectBackendUrl(url));
50+
});
51+
52+
Application.Run();
2653
}
27-
else
54+
finally
2855
{
29-
AppMain.OobeBrowserWin = new OobeBrowser();
30-
AppMain.OobeBrowserWin.Show();
56+
SingleInstance.Cleanup();
3157
}
32-
33-
// Form.Show() 后 SynchronizationContext 才可用
34-
AppMain.UiContext = SynchronizationContext.Current;
35-
36-
ServerManager.StartApp(StaticSettings.Config.IsExport, url =>
37-
{
38-
if (AppMain.BrowserWin is { IsDisposed: false } browser)
39-
browser.Invoke(() => browser.InjectBackendUrl(url));
40-
if (AppMain.OobeBrowserWin is { IsDisposed: false } oobe)
41-
oobe.Invoke(() => oobe.InjectBackendUrl(url));
42-
});
43-
44-
Application.Run();
4558
}
4659
}

0 commit comments

Comments
 (0)