From c10eae6596803bae3ef8e98e4f9eb8e648e6a168 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E8=BD=BB=E8=AF=AD?= Date: Sun, 17 May 2026 04:20:31 +0800 Subject: [PATCH 1/7] =?UTF-8?q?feat:=20=E6=96=B0=E7=9A=84=E5=8D=95?= =?UTF-8?q?=E4=BE=8B=E9=94=81=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Application.xaml.vb | 62 ++++++++++++++++------ 1 file changed, 47 insertions(+), 15 deletions(-) diff --git a/Plain Craft Launcher 2/Application.xaml.vb b/Plain Craft Launcher 2/Application.xaml.vb index 0824938..f994444 100644 --- a/Plain Craft Launcher 2/Application.xaml.vb +++ b/Plain Craft Launcher 2/Application.xaml.vb @@ -93,22 +93,22 @@ RetryCacheCheck: DirectoryUtils.Create(PathAppdata) '要求单例 If BuildType <> BuildTypes.Debug Then - Dim ShouldWaitForExit As Boolean = e.Args.Length > 0 AndAlso e.Args(0) = "--wait" '要求等待已有的 PCL 退出 - Dim WaitRetryCount As Integer = 0 -WaitRetry: - Dim WindowHwnd As IntPtr = FindWindow(Nothing, "Plain Craft Launcher ") - If WindowHwnd = IntPtr.Zero Then FindWindow(Nothing, "Plain Craft Launcher 2 ") - If WindowHwnd <> IntPtr.Zero Then - If ShouldWaitForExit AndAlso WaitRetryCount < 20 Then '至多等待 10 秒 - WaitRetryCount += 1 - Thread.Sleep(500) - GoTo WaitRetry + If Not GetProgramLock(FileLockPath) Then + Dim IsLocked = False + Dim ShouldWaitForExit As Boolean = e.Args.Length > 0 AndAlso e.Args(0) = "--wait" '要求等待已有的 PCL 退出 + If Not ShouldWaitForExit Then + DropToTopByLock(FileLockPath) + Beep() + Environment.Exit(ProcessReturnValues.Cancel) End If - '将已有的 PCL 窗口拖出来 - ShowWindowToTop(WindowHwnd) - '播放提示音并退出 - Beep() - Environment.[Exit](ProcessReturnValues.Cancel) + For i = 0 To 10 + If GetProgramLock(FileLockPath) Then + IsLocked = True + Exit For + End If + Thread.Sleep(500) + Next + If Not IsLocked Then DropToTopByLock(FileLockPath) End If End If '设置 ToolTipService 默认值 @@ -162,6 +162,38 @@ WaitRetry: FormMain.EndProgramForce(ProcessReturnValues.Exception) End Try End Sub + + Private Shared KernelLock As Mutex + + ''' + ''' 尝试获取单例锁 + ''' + ''' 文件锁位置 + ''' 一个值用于指示是否获得文件锁 + Private Function GetProgramLock(LockPath As String) As Boolean + Try + Dim IsLocked = False + KernelLock = New Mutex(True, "Plain Craft Launcher", IsLocked) + If Not IsLocked Then Return False + Logger.Info("获取单例锁成功") + File.WriteAllText(LockPath, Process.GetCurrentProcess().Id.ToString()) + Return IsLocked + Catch ex As Exception + + End Try + + Return False + End Function + + ''' + ''' 从文件锁中尝试拖出进程 + ''' + Public Sub DropToTopByLock(LockPath As String) + Dim Content = File.ReadAllBytes(LockPath) + Dim Pid As Integer + If Not Integer.TryParse(Encoding.UTF8.GetString(Content), Pid) Then Return + ShowWindowToTop(Process.GetProcessById(Pid).MainWindowHandle) + End Sub '结束 Private Sub Application_SessionEnding(sender As Object, e As SessionEndingCancelEventArgs) Handles Me.SessionEnding From f5370a17438bbbe3aea7777fc69de78d0d3d93e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E8=BD=BB=E8=AF=AD?= Date: Sun, 17 May 2026 04:25:36 +0800 Subject: [PATCH 2/7] fix: undefined var --- Plain Craft Launcher 2/Application.xaml.vb | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Plain Craft Launcher 2/Application.xaml.vb b/Plain Craft Launcher 2/Application.xaml.vb index f994444..fff4c5f 100644 --- a/Plain Craft Launcher 2/Application.xaml.vb +++ b/Plain Craft Launcher 2/Application.xaml.vb @@ -91,6 +91,13 @@ RetryCacheCheck: End Try DirectoryUtils.Create(PathTemp & "Cache\") DirectoryUtils.Create(PathAppdata) + +#If DEBUG Then + Dim FileLockPath = Path.Combine(PathAppdata.TrimEnd("\"), "PCL.dev.Lock") +#Else + Dim FileLockPath = Path.Combine(PathAppdata.TrimEnd("\"), "PCL.Lock") +#End If + '要求单例 If BuildType <> BuildTypes.Debug Then If Not GetProgramLock(FileLockPath) Then From e24311c7cfeb3f39b7fa546176b85fafae1e005e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E8=BD=BB=E8=AF=AD?= Date: Sun, 17 May 2026 04:30:27 +0800 Subject: [PATCH 3/7] =?UTF-8?q?fix:=20=E6=9C=AA=E8=B0=83=E7=94=A8=20Exit?= =?UTF-8?q?=20=E5=AF=BC=E8=87=B4=E7=A8=8B=E5=BA=8F=E7=BB=A7=E7=BB=AD?= =?UTF-8?q?=E6=89=A7=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Plain Craft Launcher 2/Application.xaml.vb | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Application.xaml.vb b/Plain Craft Launcher 2/Application.xaml.vb index fff4c5f..a529f2e 100644 --- a/Plain Craft Launcher 2/Application.xaml.vb +++ b/Plain Craft Launcher 2/Application.xaml.vb @@ -115,7 +115,12 @@ RetryCacheCheck: End If Thread.Sleep(500) Next - If Not IsLocked Then DropToTopByLock(FileLockPath) + If Not IsLocked Then + DropToTopByLock(FileLockPath) + DropToTopByLock(FileLockPath) + Beep() + Environment.Exit(ProcessReturnValues.Cancel) + End If End If End If '设置 ToolTipService 默认值 @@ -200,6 +205,7 @@ RetryCacheCheck: Dim Pid As Integer If Not Integer.TryParse(Encoding.UTF8.GetString(Content), Pid) Then Return ShowWindowToTop(Process.GetProcessById(Pid).MainWindowHandle) + End Sub '结束 From bbb218217581f538ca1ae9a7b7db468d55f385a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E8=BD=BB=E8=AF=AD?= Date: Sun, 17 May 2026 04:33:49 +0800 Subject: [PATCH 4/7] chore: add handle valid check --- Plain Craft Launcher 2/Application.xaml.vb | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/Plain Craft Launcher 2/Application.xaml.vb b/Plain Craft Launcher 2/Application.xaml.vb index a529f2e..e5d352b 100644 --- a/Plain Craft Launcher 2/Application.xaml.vb +++ b/Plain Craft Launcher 2/Application.xaml.vb @@ -201,11 +201,10 @@ RetryCacheCheck: ''' 从文件锁中尝试拖出进程 ''' Public Sub DropToTopByLock(LockPath As String) - Dim Content = File.ReadAllBytes(LockPath) Dim Pid As Integer - If Not Integer.TryParse(Encoding.UTF8.GetString(Content), Pid) Then Return - ShowWindowToTop(Process.GetProcessById(Pid).MainWindowHandle) - + If Not Integer.TryParse(File.ReadAllText(LockPath), Pid) Then Return + Dim Handle = Process.GetProcessById(Pid)?.MainWindowHandle + If Handle <> Intptr.Zero ShowWindowToTop(Handle) End Sub '结束 From c2580809e02792863b72f674f3086fa01ccd26fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E8=BD=BB=E8=AF=AD?= Date: Sun, 17 May 2026 04:34:24 +0800 Subject: [PATCH 5/7] fix: incorrect code --- Plain Craft Launcher 2/Application.xaml.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Application.xaml.vb b/Plain Craft Launcher 2/Application.xaml.vb index e5d352b..f3c55ba 100644 --- a/Plain Craft Launcher 2/Application.xaml.vb +++ b/Plain Craft Launcher 2/Application.xaml.vb @@ -204,7 +204,7 @@ RetryCacheCheck: Dim Pid As Integer If Not Integer.TryParse(File.ReadAllText(LockPath), Pid) Then Return Dim Handle = Process.GetProcessById(Pid)?.MainWindowHandle - If Handle <> Intptr.Zero ShowWindowToTop(Handle) + If Handle <> Intptr.Zero Then ShowWindowToTop(Handle) End Sub '结束 From ac18b979ceb375255fe17a197127a725907849d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E8=BD=BB=E8=AF=AD?= Date: Sun, 17 May 2026 04:48:05 +0800 Subject: [PATCH 6/7] fix: use local namespace --- Plain Craft Launcher 2/Application.xaml.vb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plain Craft Launcher 2/Application.xaml.vb b/Plain Craft Launcher 2/Application.xaml.vb index f3c55ba..bbe0f08 100644 --- a/Plain Craft Launcher 2/Application.xaml.vb +++ b/Plain Craft Launcher 2/Application.xaml.vb @@ -185,7 +185,7 @@ RetryCacheCheck: Private Function GetProgramLock(LockPath As String) As Boolean Try Dim IsLocked = False - KernelLock = New Mutex(True, "Plain Craft Launcher", IsLocked) + KernelLock = New Mutex(True, "Local\Plain Craft Launcher", IsLocked) If Not IsLocked Then Return False Logger.Info("获取单例锁成功") File.WriteAllText(LockPath, Process.GetCurrentProcess().Id.ToString()) From 3d4b768af9b5e63f931a1faed7e63e96811a02d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=97=E8=BD=BB=E8=AF=AD?= Date: Mon, 18 May 2026 20:29:39 +0800 Subject: [PATCH 7/7] =?UTF-8?q?fix:=20=E9=87=8D=E5=A4=8D=E8=B0=83=E7=94=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removed duplicate call to DropToTopByLock. --- Plain Craft Launcher 2/Application.xaml.vb | 1 - 1 file changed, 1 deletion(-) diff --git a/Plain Craft Launcher 2/Application.xaml.vb b/Plain Craft Launcher 2/Application.xaml.vb index bbe0f08..872bc91 100644 --- a/Plain Craft Launcher 2/Application.xaml.vb +++ b/Plain Craft Launcher 2/Application.xaml.vb @@ -116,7 +116,6 @@ RetryCacheCheck: Thread.Sleep(500) Next If Not IsLocked Then - DropToTopByLock(FileLockPath) DropToTopByLock(FileLockPath) Beep() Environment.Exit(ProcessReturnValues.Cancel)