From a960f769207257d0b1dfc64b8ea75749de2f5490 Mon Sep 17 00:00:00 2001 From: ema Date: Mon, 4 Nov 2024 03:45:08 +0800 Subject: [PATCH] feat: restore from another instance --- .../GameTask/AutoWood/AutoWoodTask.cs | 4 ++-- BetterGenshinImpact/GameTask/SystemControl.cs | 21 ++++++++++++++++++- BetterGenshinImpact/Helpers/RuntimeHelper.cs | 16 +++++++------- 3 files changed, 31 insertions(+), 10 deletions(-) diff --git a/BetterGenshinImpact/GameTask/AutoWood/AutoWoodTask.cs b/BetterGenshinImpact/GameTask/AutoWood/AutoWoodTask.cs index 634f72d4..7b3146a2 100644 --- a/BetterGenshinImpact/GameTask/AutoWood/AutoWoodTask.cs +++ b/BetterGenshinImpact/GameTask/AutoWood/AutoWoodTask.cs @@ -405,7 +405,7 @@ private void Felling(WoodTaskParam taskParam, bool isLast = false) private void PressZ(WoodTaskParam taskParam) { // IMPORTANT: MUST try focus before press Z - SystemControl.Focus(TaskContext.Instance().GameHandle); + SystemControl.FocusWindow(TaskContext.Instance().GameHandle); if (_first) { @@ -457,7 +457,7 @@ private void PressZ(WoodTaskParam taskParam) private void PressEsc(WoodTaskParam taskParam) { - SystemControl.Focus(TaskContext.Instance().GameHandle); + SystemControl.FocusWindow(TaskContext.Instance().GameHandle); Simulation.SendInput.Keyboard.KeyPress(VK.VK_ESCAPE); // if (TaskContext.Instance().Config.AutoWoodConfig.PressTwoEscEnabled) // { diff --git a/BetterGenshinImpact/GameTask/SystemControl.cs b/BetterGenshinImpact/GameTask/SystemControl.cs index ad6564fe..a061666a 100644 --- a/BetterGenshinImpact/GameTask/SystemControl.cs +++ b/BetterGenshinImpact/GameTask/SystemControl.cs @@ -178,18 +178,37 @@ public static void ActivateWindow() ActivateWindow(TaskContext.Instance().GameHandle); } - public static void Focus(nint hWnd) + public static void FocusWindow(nint hWnd) { if (User32.IsWindow(hWnd)) { _ = User32.SendMessage(hWnd, User32.WindowMessage.WM_SYSCOMMAND, User32.SysCommand.SC_RESTORE, 0); _ = User32.SetForegroundWindow(hWnd); + while (User32.IsIconic(hWnd)) { continue; } _ = User32.BringWindowToTop(hWnd); + _ = User32.SetActiveWindow(hWnd); + } + } + + public static void RestoreWindow(nint hWnd) + { + if (User32.IsWindow(hWnd)) + { + _ = User32.SendMessage(hWnd, User32.WindowMessage.WM_SYSCOMMAND, User32.SysCommand.SC_RESTORE, 0); + _ = User32.SetForegroundWindow(hWnd); + + if (User32.IsIconic(hWnd)) + { + _ = User32.ShowWindow(hWnd, ShowWindowCommand.SW_RESTORE); + } + + _ = User32.BringWindowToTop(hWnd); + _ = User32.SetActiveWindow(hWnd); } } diff --git a/BetterGenshinImpact/Helpers/RuntimeHelper.cs b/BetterGenshinImpact/Helpers/RuntimeHelper.cs index 72edb1b1..42c6c495 100644 --- a/BetterGenshinImpact/Helpers/RuntimeHelper.cs +++ b/BetterGenshinImpact/Helpers/RuntimeHelper.cs @@ -1,4 +1,5 @@ using BetterGenshinImpact.Core.Config; +using BetterGenshinImpact.GameTask; using Microsoft.Extensions.Hosting; using System; using System.ComponentModel; @@ -9,6 +10,8 @@ using System.Text; using System.Threading; using System.Threading.Tasks; +using System.Windows; +using System.Windows.Interop; namespace BetterGenshinImpact.Helpers; @@ -116,19 +119,18 @@ public static void CheckSingleInstance(string instanceName, Action callbac handle = new EventWaitHandle(false, EventResetMode.AutoReset, instanceName); } - Task.Factory.StartNew(() => + _ = Task.Factory.StartNew(() => { while (handle.WaitOne()) { -#if false - UIDispatcherHelper.BeginInvoke(main => + Application.Current.Dispatcher?.BeginInvoke(() => { - main?.Activate(); - main?.Show(); + Application.Current.MainWindow?.Show(); + Application.Current.MainWindow?.Activate(); + SystemControl.RestoreWindow(new WindowInteropHelper(Application.Current.MainWindow).Handle); }); -#endif } - }, TaskCreationOptions.LongRunning); + }, TaskCreationOptions.LongRunning).ConfigureAwait(false); } public static void CheckIntegration()