diff --git a/BetterGenshinImpact/View/Drawable/VisionContext.cs b/BetterGenshinImpact/View/Drawable/VisionContext.cs index 3b290a22..066acbff 100644 --- a/BetterGenshinImpact/View/Drawable/VisionContext.cs +++ b/BetterGenshinImpact/View/Drawable/VisionContext.cs @@ -27,7 +27,7 @@ namespace BetterGenshinImpact.View.Drawable return _uniqueInstance; } - public ILogger? Log { get; set; } + //public ILogger? Log { get; set; } public bool Drawable { get; set; } diff --git a/BetterGenshinImpact/View/MaskWindow.xaml b/BetterGenshinImpact/View/MaskWindow.xaml index 5ea75840..eacc347d 100644 --- a/BetterGenshinImpact/View/MaskWindow.xaml +++ b/BetterGenshinImpact/View/MaskWindow.xaml @@ -1,11 +1,31 @@  + Height="{Binding H,Mode=TwoWay}" + Width="{Binding W, Mode=TwoWay}" + Left="{Binding X, Mode=TwoWay}" + Top="{Binding Y, Mode=TwoWay}" + > + + + + + + + + + ? Logger { get; set; } - private static readonly Typeface MyTypeface = new FontFamily("微软雅黑").GetTypefaces().First(); - public static MaskWindow Instance(ILogger? logger = null) + public static MaskWindow Instance(IntPtr? hWnd = null) { _maskWindow ??= new MaskWindow(); - _maskWindow.Logger ??= logger; - VisionContext.Instance().Log ??= logger; + if (hWnd != null) + { + User32.GetWindowRect(hWnd.Value, out var rect); + double scale = DpiHelper.ScaleY; + _maskWindow.Left = (int)Math.Ceiling(rect.X * 1d / scale); + _maskWindow.Top = (int)Math.Ceiling(rect.Y * 1d / scale); + _maskWindow.Width = (int)Math.Ceiling(rect.Width * 1d / scale); + _maskWindow.Height = (int)Math.Ceiling(rect.Height * 1d / scale); + Debug.WriteLine($"原神窗口大小:{rect.Width} x {rect.Height}"); + Debug.WriteLine($"原神窗口大小(计算DPI缩放后):{_maskWindow.Width} x {_maskWindow.Height}"); + } + return _maskWindow; } @@ -93,7 +104,6 @@ namespace BetterGenshinImpact.View catch (Exception e) { Debug.WriteLine(e); - Logger?.LogError(e, "绘制识别结果时发生错误"); } base.OnRender(drawingContext); @@ -105,7 +115,6 @@ namespace BetterGenshinImpact.View public void AddAreaSettingsControl(string name) { - Logger?.LogInformation("添加设置控件"); var control = new ContentControl(); control.Width = 100; control.Height = 100; diff --git a/BetterGenshinImpact/ViewModel/MainWindowViewModel.cs b/BetterGenshinImpact/ViewModel/MainWindowViewModel.cs index b5b1d9ec..9606bf7c 100644 --- a/BetterGenshinImpact/ViewModel/MainWindowViewModel.cs +++ b/BetterGenshinImpact/ViewModel/MainWindowViewModel.cs @@ -4,11 +4,13 @@ using BetterGenshinImpact.View; using BetterGenshinImpact.View.Test; using CommunityToolkit.Mvvm.ComponentModel; using CommunityToolkit.Mvvm.Input; +using CommunityToolkit.Mvvm.Messaging; using Fischless.WindowCapture; using Microsoft.Extensions.Logging; using System; using System.Diagnostics; using System.Windows; +using CommunityToolkit.Mvvm.Messaging.Messages; using Vanara.PInvoke; namespace BetterGenshinImpact.ViewModel @@ -30,7 +32,7 @@ namespace BetterGenshinImpact.ViewModel { //TestMask(); //TestRect(); - Debug.WriteLine(DpiHelper.ScaleY); + //Debug.WriteLine(DpiHelper.ScaleY); } [RelayCommand] @@ -96,34 +98,11 @@ namespace BetterGenshinImpact.ViewModel private void ShowMaskWindow(IntPtr hWnd) { - User32.GetWindowRect(hWnd, out var rect); - //var x = rect.X; - //var y = rect.Y; - //var w = rect.Width; - //var h = rect.Height; - - var x = (int)Math.Ceiling(rect.X / DpiHelper.ScaleY); - var y = (int)Math.Ceiling(rect.Y / DpiHelper.ScaleY); - var w = (int)Math.Ceiling(rect.Width / DpiHelper.ScaleY); - var h = (int)Math.Ceiling(rect.Height / DpiHelper.ScaleY); - Debug.WriteLine($"原神窗口大小:{rect.Width} x {rect.Height}"); - Debug.WriteLine($"原神窗口大小(计算DPI缩放后):{w} x {h}"); - - //var x = 0; - //var y = 0; - //var w = 1200; - //var h = 800; - _maskWindow ??= MaskWindow.Instance(); - ////window.Owner = this; - _maskWindow.Left = x; - _maskWindow.Top = y; - _maskWindow.Width = w; - _maskWindow.Height = h; - _maskWindow.Logger = App.GetLogger(); + _maskWindow.Show(); + WeakReferenceMessenger.Default.Send(new PropertyChangedMessage(this, "hWnd", hWnd, hWnd)); - _logger.LogInformation("- 遮罩窗口启动成功"); } } } \ No newline at end of file diff --git a/BetterGenshinImpact/ViewModel/MaskWindowViewModel.cs b/BetterGenshinImpact/ViewModel/MaskWindowViewModel.cs new file mode 100644 index 00000000..898c8297 --- /dev/null +++ b/BetterGenshinImpact/ViewModel/MaskWindowViewModel.cs @@ -0,0 +1,57 @@ +using BetterGenshinImpact.GameTask; +using BetterGenshinImpact.Helpers; +using BetterGenshinImpact.View; +using BetterGenshinImpact.View.Test; +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using Fischless.WindowCapture; +using Microsoft.Extensions.Logging; +using System; +using System.Diagnostics; +using System.Windows; +using CommunityToolkit.Mvvm.Messaging; +using CommunityToolkit.Mvvm.Messaging.Messages; +using Vanara.PInvoke; +using System.Windows.Threading; + +namespace BetterGenshinImpact.ViewModel +{ + public partial class MaskWindowViewModel : ObservableRecipient + { + [ObservableProperty] private string[] _modeNames = WindowCaptureFactory.ModeNames(); + + [ObservableProperty] private Rect _windowRect; + + [ObservableProperty] private int _x; + [ObservableProperty] private int _y; + [ObservableProperty] private int _w; + [ObservableProperty] private int _h; + + private ILogger? _logger; + + public MaskWindowViewModel() + { + WeakReferenceMessenger.Default.Register>(this, (sender, msg) => + { + User32.GetWindowRect(msg.NewValue, out var rect); + //_windowRect.X = (int)Math.Ceiling(rect.X / DpiHelper.ScaleY); + //_windowRect.Y = (int)Math.Ceiling(rect.Y / DpiHelper.ScaleY); + //_windowRect.Width = (int)Math.Ceiling(rect.Width / DpiHelper.ScaleY); + //_windowRect.Height = (int)Math.Ceiling(rect.Height / DpiHelper.ScaleY); + _x = (int)Math.Ceiling(rect.X / DpiHelper.ScaleY); + _y = (int)Math.Ceiling(rect.Y / DpiHelper.ScaleY); + _w = (int)Math.Ceiling(rect.Width / DpiHelper.ScaleY); + _h = (int)Math.Ceiling(rect.Height / DpiHelper.ScaleY); + Debug.WriteLine($"原神窗口大小:{rect.Width} x {rect.Height}"); + Debug.WriteLine($"原神窗口大小(计算DPI缩放后):{_w} x {_h}"); + }); + } + + [RelayCommand] + private void OnLoaded() + { + _logger = App.GetLogger(); + _logger.LogInformation("遮罩窗口启OnLoaded"); + } + } +} \ No newline at end of file