add take screenshot

This commit is contained in:
huiyadanli
2024-02-08 14:47:26 +08:00
parent c1018bf3fd
commit 1c345eae16
7 changed files with 271 additions and 14 deletions

View File

@@ -52,6 +52,11 @@ namespace BetterGenshinImpact.Core.Config
/// </summary>
public MaskWindowConfig MaskWindowConfig { get; set; } = new();
/// <summary>
/// 通用配置
/// </summary>
public CommonConfig CommonConfig { get; set; } = new();
/// <summary>
/// 原神启动配置
/// </summary>
@@ -113,6 +118,7 @@ namespace BetterGenshinImpact.Core.Config
{
this.PropertyChanged += OnAnyPropertyChanged;
MaskWindowConfig.PropertyChanged += OnAnyPropertyChanged;
CommonConfig.PropertyChanged += OnAnyPropertyChanged;
GenshinStartConfig.PropertyChanged += OnAnyPropertyChanged;
AutoPickConfig.PropertyChanged += OnAnyPropertyChanged;

View File

@@ -0,0 +1,23 @@
using System;
using System.Text.Json.Serialization;
using CommunityToolkit.Mvvm.ComponentModel;
using OpenCvSharp;
namespace BetterGenshinImpact.Core.Config
{
/// <summary>
/// 遮罩窗口配置
/// </summary>
[Serializable]
public partial class CommonConfig : ObservableObject
{
/// <summary>
/// 是否启用遮罩窗口
/// </summary>
[ObservableProperty] private bool _screenshotEnabled = false;
/// <summary>
/// UID遮盖是否启用
/// </summary>
[ObservableProperty] private bool _screenshotUidCoverEnabled = false;
}
}

View File

@@ -18,6 +18,10 @@ public partial class HotKeyConfig : ObservableObject
[ObservableProperty] private string _bgiEnabledHotkey = "F11";
[ObservableProperty] private string _bgiEnabledHotkeyType = HotKeyTypeEnum.GlobalRegister.ToString();
// 截图
[ObservableProperty] private string _takeScreenshotHotkey = "";
[ObservableProperty] private string _takeScreenshotHotkeyType = HotKeyTypeEnum.KeyboardMonitor.ToString();
[ObservableProperty] private string _autoPickEnabledHotkey = "";
[ObservableProperty] private string _autoPickEnabledHotkeyType = HotKeyTypeEnum.KeyboardMonitor.ToString();
@@ -27,6 +31,13 @@ public partial class HotKeyConfig : ObservableObject
[ObservableProperty] private string _autoFishingEnabledHotkey = "";
[ObservableProperty] private string _autoFishingEnabledHotkeyType = HotKeyTypeEnum.KeyboardMonitor.ToString();
[ObservableProperty] private string _quickTeleportEnabledHotkey = "";
[ObservableProperty] private string _quickTeleportEnabledHotkeyType = HotKeyTypeEnum.KeyboardMonitor.ToString();
// 快捷传送触发
[ObservableProperty] private string _quickTeleportTickHotkey = "";
[ObservableProperty] private string _quickTeleportTickHotkeyType = HotKeyTypeEnum.KeyboardMonitor.ToString();
[ObservableProperty] private string _turnAroundHotkey = "";
[ObservableProperty] private string _turnAroundHotkeyType = HotKeyTypeEnum.KeyboardMonitor.ToString();

View File

@@ -16,7 +16,11 @@ using System.Drawing;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using BetterGenshinImpact.Core.Config;
using Vanara.PInvoke;
using System.IO;
using System.Drawing.Imaging;
using static System.Windows.Forms.VisualStyles.VisualStyleElement.TrackBar;
namespace BetterGenshinImpact.GameTask
{
@@ -100,6 +104,12 @@ namespace BetterGenshinImpact.GameTask
// 启动截图
GameCapture.Start(hWnd);
// 捕获模式初始化配置
if (TaskContext.Instance().Config.CommonConfig.ScreenshotEnabled)
{
_dispatcherCacheCaptureMode = DispatcherCaptureModeEnum.CacheCaptureWithTrigger;
}
// 读取游戏注册表配置
ReadGameSettings();
@@ -135,9 +145,9 @@ namespace BetterGenshinImpact.GameTask
var systemInfo = TaskContext.Instance().SystemInfo;
var width = systemInfo.GameScreenSize.Width;
var height = systemInfo.GameScreenSize.Height;
var dpiScale = DpiHelper.ScaleY;
var dpiScale = TaskContext.Instance().DpiScale;
_logger.LogInformation("当前游戏分辨率{Width}x{Height},素材缩放比率{Scale}DPI缩放{Dpi}",
width, height, systemInfo.AssetScale.ToString("F"), TaskContext.Instance().DpiScale);
width, height, systemInfo.AssetScale.ToString("F"), dpiScale);
if (width * 9 != height * 16)
{
@@ -381,6 +391,11 @@ namespace BetterGenshinImpact.GameTask
_dispatcherCacheCaptureMode = mode;
}
public DispatcherCaptureModeEnum GetCacheCaptureMode()
{
return _dispatcherCacheCaptureMode;
}
public Bitmap GetLastCaptureBitmap()
{
lock (_bitmapLocker)
@@ -394,5 +409,36 @@ namespace BetterGenshinImpact.GameTask
var bitmap = GetLastCaptureBitmap();
return new CaptureContent(bitmap, _frameIndex, _timer.Interval, this);
}
public void TakeScreenshot()
{
if (_dispatcherCacheCaptureMode is DispatcherCaptureModeEnum.OnlyCacheCapture or DispatcherCaptureModeEnum.CacheCaptureWithTrigger)
{
try
{
var path = Global.Absolute($@"log\screenshot\");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
var bitmap = GetLastCaptureBitmap();
var name = $@"{DateTime.Now:yyyyMMddHHmmssffff}.png";
var savePath = Global.Absolute($@"log\screenshot\{name}");
bitmap.Save(savePath, ImageFormat.Png);
_logger.LogInformation("截图已保存: {Name}", name);
}
catch (Exception e)
{
_logger.LogError("截图保存失败: {Message}", e.Message);
_logger.LogDebug("截图保存失败: {StackTrace}", e.StackTrace);
}
}
else
{
_logger.LogWarning("当前不处于截图模式,无法保存截图");
}
}
}
}

View File

@@ -1,13 +1,13 @@
<Page x:Class="BetterGenshinImpact.View.Pages.CommonSettingsPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:BetterGenshinImpact.View.Pages"
xmlns:pages="clr-namespace:BetterGenshinImpact.ViewModel.Pages"
xmlns:ui="http://schemas.lepo.co/wpfui/2022/xaml"
xmlns:b="http://schemas.microsoft.com/xaml/behaviors"
mc:Ignorable="d"
mc:Ignorable="d"
d:DataContext="{d:DesignInstance Type=pages:CommonSettingsPageViewModel}"
ui:Design.Background="{DynamicResource ApplicationBackgroundBrush}"
ui:Design.Foreground="{DynamicResource TextFillColorPrimaryBrush}"
@@ -19,7 +19,7 @@
<ui:TextBlock
Margin="0,0,0,8"
FontTypography="BodyStrong"
Text="遮罩窗口设置" />
Text="软件设置" />
<ui:CardExpander Margin="0,0,0,12" ContentPadding="0" Icon="{ui:SymbolIcon SquareHintSparkles24}">
<ui:CardExpander.Header>
@@ -43,7 +43,7 @@
Grid.Column="0"
Foreground="{ui:ThemeResource TextFillColorTertiaryBrush}"
TextWrapping="Wrap"
Text="重启软件后生效,全屏游戏下此功能无用" />
Text="重启软件后生效,独占全屏模式下此模式不一定生效" />
<ui:ToggleSwitch
Grid.Row="0"
Grid.RowSpan="2"
@@ -79,7 +79,7 @@
Grid.RowSpan="2"
Grid.Column="1"
Margin="0,0,36,0"
IsChecked="{Binding Config.MaskWindowConfig.ShowLogBox, Mode=TwoWay}" >
IsChecked="{Binding Config.MaskWindowConfig.ShowLogBox, Mode=TwoWay}">
<b:Interaction.Triggers>
<b:EventTrigger EventName="Unchecked">
<b:InvokeCommandAction Command="{Binding RefreshMaskSettingsCommand}" />
@@ -172,7 +172,7 @@
Grid.RowSpan="2"
Grid.Column="1"
Margin="0,0,36,0"
IsChecked="{Binding Config.MaskWindowConfig.UidCoverEnabled, Mode=TwoWay}" >
IsChecked="{Binding Config.MaskWindowConfig.UidCoverEnabled, Mode=TwoWay}">
<b:Interaction.Triggers>
<b:EventTrigger EventName="Unchecked">
<b:InvokeCommandAction Command="{Binding RefreshMaskSettingsCommand}" />
@@ -209,7 +209,7 @@
Grid.RowSpan="2"
Grid.Column="1"
Margin="0,0,36,0"
IsChecked="{Binding Config.MaskWindowConfig.DirectionsEnabled, Mode=TwoWay}" >
IsChecked="{Binding Config.MaskWindowConfig.DirectionsEnabled, Mode=TwoWay}">
<b:Interaction.Triggers>
<b:EventTrigger EventName="Unchecked">
<b:InvokeCommandAction Command="{Binding RefreshMaskSettingsCommand}" />
@@ -223,6 +223,115 @@
</StackPanel>
</ui:CardExpander>
<!-- 截图 -->
<ui:CardExpander Margin="0,0,0,12" ContentPadding="0" Icon="{ui:SymbolIcon SquareHintSparkles24}">
<ui:CardExpander.Header>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ui:TextBlock
Grid.Row="0"
Grid.Column="0"
FontTypography="Body"
TextWrapping="Wrap"
Text="启用截图功能(开发者)" />
<ui:TextBlock
Grid.Row="1"
Grid.Column="0"
Foreground="{ui:ThemeResource TextFillColorTertiaryBrush}"
TextWrapping="Wrap">
启用后可以通过快捷键截图,文件保存在
<Hyperlink Command="{Binding GoToFolderCommand}"
Foreground="{ui:ThemeResource TextFillColorSecondaryBrush}">
log/screenshot
</Hyperlink>
</ui:TextBlock>
<ui:ToggleSwitch
Grid.Row="0"
Grid.RowSpan="2"
Grid.Column="1"
Margin="0,0,24,0"
IsChecked="{Binding Config.CommonConfig.ScreenshotEnabled, Mode=TwoWay}" >
<b:Interaction.Triggers>
<b:EventTrigger EventName="Unchecked">
<b:InvokeCommandAction Command="{Binding SwitchTakenScreenshotEnabledCommand}" />
</b:EventTrigger>
<b:EventTrigger EventName="Checked">
<b:InvokeCommandAction Command="{Binding SwitchTakenScreenshotEnabledCommand}" />
</b:EventTrigger>
</b:Interaction.Triggers>
</ui:ToggleSwitch>
</Grid>
</ui:CardExpander.Header>
<StackPanel>
<Grid Margin="16">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ui:TextBlock
Grid.Row="0"
Grid.Column="0"
FontTypography="Body"
TextWrapping="Wrap"
Text="截图快捷键" />
<ui:TextBlock
Grid.Row="1"
Grid.Column="0"
Foreground="{ui:ThemeResource TextFillColorTertiaryBrush}"
TextWrapping="Wrap"
Text="截图功能主要用于错误排查,训练素材快速获取等开发相关功能" />
<ui:Button
Grid.Row="0"
Grid.RowSpan="2"
Grid.Column="1"
Margin="0,0,36,0"
Content="绑定快捷键"
Command="{Binding GoToHotKeyPageCommand}"/>
</Grid>
<Grid Margin="16">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<ui:TextBlock
Grid.Row="0"
Grid.Column="0"
FontTypography="Body"
TextWrapping="Wrap"
Text="截图遮盖UID" />
<ui:TextBlock
Grid.Row="1"
Grid.Column="0"
Foreground="{ui:ThemeResource TextFillColorTertiaryBrush}"
TextWrapping="Wrap"
Text="生成的截图会遮盖右下角的UID区域" />
<ui:ToggleSwitch
Grid.Row="0"
Grid.RowSpan="2"
Grid.Column="1"
Margin="0,0,36,0"
IsChecked="{Binding Config.CommonConfig.ScreenshotUidCoverEnabled, Mode=TwoWay}">
</ui:ToggleSwitch>
</Grid>
</StackPanel>
</ui:CardExpander>
<!--<ui:CardControl Margin="0,0,0,12" Icon="{ui:SymbolIcon Keyboard24}">
<ui:CardControl.Header>
<Grid>
@@ -249,4 +358,4 @@
IsChecked="{Binding Config.MaskWindowConfig.ShowLogBox, Mode=TwoWay}"/>
</ui:CardControl>-->
</StackPanel>
</Page>
</Page>

View File

@@ -1,10 +1,17 @@
using BetterGenshinImpact.Core.Config;
using System.Diagnostics;
using BetterGenshinImpact.Core.Config;
using BetterGenshinImpact.Service.Interface;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging.Messages;
using CommunityToolkit.Mvvm.Messaging;
using Wpf.Ui.Controls;
using BetterGenshinImpact.View.Pages;
using Wpf.Ui;
using System;
using System.IO;
using BetterGenshinImpact.GameTask;
using BetterGenshinImpact.GameTask.Model.Enum;
namespace BetterGenshinImpact.ViewModel.Pages;
@@ -12,9 +19,12 @@ public partial class CommonSettingsPageViewModel : ObservableObject, INavigation
{
public AllConfig Config { get; set; }
public CommonSettingsPageViewModel(IConfigService configService)
private readonly INavigationService _navigationService;
public CommonSettingsPageViewModel(IConfigService configService, INavigationService navigationService)
{
Config = configService.Get();
_navigationService = navigationService;
}
public void OnNavigatedTo()
@@ -30,4 +40,34 @@ public partial class CommonSettingsPageViewModel : ObservableObject, INavigation
{
WeakReferenceMessenger.Default.Send(new PropertyChangedMessage<object>(this, "RefreshSettings", new object(), "重新计算控件位置"));
}
[RelayCommand]
public void OnGoToHotKeyPage()
{
_navigationService.Navigate(typeof(HotKeyPage));
}
[RelayCommand]
public void OnSwitchTakenScreenshotEnabled()
{
if (Config.CommonConfig.ScreenshotEnabled)
{
if (TaskTriggerDispatcher.Instance().GetCacheCaptureMode() == DispatcherCaptureModeEnum.OnlyTrigger)
{
TaskTriggerDispatcher.Instance().SetCacheCaptureMode(DispatcherCaptureModeEnum.CacheCaptureWithTrigger);
}
}
}
[RelayCommand]
public void OnGoToFolder()
{
var path = Global.Absolute(@"log\screenshot\");
if (!Directory.Exists(path))
{
Directory.CreateDirectory(path);
}
Process.Start("explorer.exe", path);
}
}

View File

@@ -90,6 +90,7 @@ public partial class HotKeyPageViewModel : ObservableObject
{
return;
}
foreach (var hotKeySettingModel in HotKeySettingModels)
{
if (hotKeySettingModel.HotKey.IsEmpty)
@@ -102,7 +103,6 @@ public partial class HotKeyPageViewModel : ObservableObject
hotKeySettingModel.HotKey = HotKey.None;
}
}
}
private void BuildHotKeySettingModelList()
@@ -116,6 +116,15 @@ public partial class HotKeyPageViewModel : ObservableObject
);
HotKeySettingModels.Add(bgiEnabledHotKeySettingModel);
var takeScreenshotHotKeySettingModel = new HotKeySettingModel(
"游戏截图(开发者)",
nameof(Config.HotKeyConfig.TakeScreenshotHotkey),
Config.HotKeyConfig.TakeScreenshotHotkey,
Config.HotKeyConfig.TakeScreenshotHotkeyType,
(_, _) => { TaskTriggerDispatcher.Instance().TakeScreenshot(); }
);
HotKeySettingModels.Add(takeScreenshotHotKeySettingModel);
var autoPickEnabledHotKeySettingModel = new HotKeySettingModel(
"自动拾取开关",
nameof(Config.HotKeyConfig.AutoPickEnabledHotkey),
@@ -155,6 +164,19 @@ public partial class HotKeyPageViewModel : ObservableObject
);
HotKeySettingModels.Add(autoFishingEnabledHotKeySettingModel);
var quickTeleportEnabledHotKeySettingModel = new HotKeySettingModel(
"快速传送开关",
nameof(Config.HotKeyConfig.QuickTeleportEnabledHotkey),
Config.HotKeyConfig.QuickTeleportEnabledHotkey,
Config.HotKeyConfig.QuickTeleportEnabledHotkeyType,
(_, _) =>
{
TaskContext.Instance().Config.QuickTeleportConfig.Enabled = !TaskContext.Instance().Config.QuickTeleportConfig.Enabled;
_logger.LogInformation("切换{Name}状态为[{Enabled}]", "快速传送", ToChinese(TaskContext.Instance().Config.QuickTeleportConfig.Enabled));
}
);
HotKeySettingModels.Add(quickTeleportEnabledHotKeySettingModel);
var turnAroundHotKeySettingModel = new HotKeySettingModel(
"长按旋转视角 - 那维莱特转圈",
nameof(Config.HotKeyConfig.TurnAroundHotkey),