mirror of
https://github.com/babalae/better-genshin-impact.git
synced 2026-04-22 21:59:55 +08:00
add take screenshot
This commit is contained in:
@@ -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;
|
||||
|
||||
23
BetterGenshinImpact/Core/Config/CommonConfig.cs
Normal file
23
BetterGenshinImpact/Core/Config/CommonConfig.cs
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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("当前不处于截图模式,无法保存截图");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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>
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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),
|
||||
|
||||
Reference in New Issue
Block a user