修改录屏方式

This commit is contained in:
马巧 2025-07-21 15:23:49 +08:00
parent e79cdae0da
commit dcd6200e54
20 changed files with 163 additions and 69 deletions

View File

@ -4,6 +4,7 @@
<TargetFramework>net6.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
<Platforms>AnyCPU;x64</Platforms>
</PropertyGroup>
<ItemGroup>

View File

@ -31,8 +31,8 @@ Global
{439FA76B-F874-40DB-BAF2-E3647CD55B10}.Release|x86.Build.0 = Debug|x86
{7F9FA18B-5C28-476E-97D4-B5504B8DEB9B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7F9FA18B-5C28-476E-97D4-B5504B8DEB9B}.Debug|Any CPU.Build.0 = Debug|Any CPU
{7F9FA18B-5C28-476E-97D4-B5504B8DEB9B}.Debug|x64.ActiveCfg = Debug|Any CPU
{7F9FA18B-5C28-476E-97D4-B5504B8DEB9B}.Debug|x64.Build.0 = Debug|Any CPU
{7F9FA18B-5C28-476E-97D4-B5504B8DEB9B}.Debug|x64.ActiveCfg = Debug|x64
{7F9FA18B-5C28-476E-97D4-B5504B8DEB9B}.Debug|x64.Build.0 = Debug|x64
{7F9FA18B-5C28-476E-97D4-B5504B8DEB9B}.Debug|x86.ActiveCfg = Debug|Any CPU
{7F9FA18B-5C28-476E-97D4-B5504B8DEB9B}.Debug|x86.Build.0 = Debug|Any CPU
{7F9FA18B-5C28-476E-97D4-B5504B8DEB9B}.Release|Any CPU.ActiveCfg = Release|Any CPU

View File

@ -42,7 +42,7 @@
<!-- 无操作退出录像时间单位秒为0时不退出录像 -->
<add key="stopRecord" value="180"/>
<add key="gridConnectionString" value="MYSQL; Database=xiangtan_mazuike_xx; Password=root; Port=3306; Server=127.0.0.1; User=root;"/>
<add key="gridConnectionString" value="MYSQL; Database=xiangtanTest; Password=root; Port=3306; Server=192.168.50.84; User=root;"/>
<!-- 查询处方是orderNo还是orderGroupNo -->
<add key="OrderNoName" value="orderNo" />
<!-- 后门耗材板地址 没有则填写0-->
@ -99,7 +99,7 @@
<!-- 指纹机号码 -->
<add key="machineNumber" value="1"/>
<!-- 指纹机ip -->
<add key="fingerIp" value="192.168.50.201"/>
<add key="fingerIp" value="192.168.50.59"/>
<!-- 多处方取药 0:不启用 1启用-->
<add key="MultiOrder" value="1"/>

View File

@ -74,7 +74,6 @@
<PackageReference Include="NModbus4.NetCore" Version="2.0.1" />
<PackageReference Include="Polly" Version="8.4.1" />
<PackageReference Include="Prism.Unity" Version="8.1.97" />
<PackageReference Include="ScreenRecorderLib" Version="6.5.1" />
<PackageReference Include="SharpPromise" Version="1.7.0" />
<PackageReference Include="SqlSugarCore" Version="5.1.4.67" />
<PackageReference Include="SuperSimpleTcp" Version="3.0.10" />

View File

@ -166,7 +166,7 @@ namespace DM_Weight.ViewModels
Operator = HomeWindowViewModel.Operator?.Id,
OperationTime = DateTime.Now,
Type = 55,
InvoiceId = "手术间补药",
InvoiceId = "手术间补药入库",
}).ExecuteCommand();
_socketHelper.OpenStatus = true;
//_socketHelper.speechSynthesizer.SpeakAsyncCancelAll();

View File

@ -456,11 +456,13 @@ namespace DM_Weight.ViewModels
if (baseQty > _ChannelList.BaseQuantity)
{
//基数变大,需要补药
_ChannelList.channelStocks[0].NeedNum = _ChannelList.channelStocks[0].NeedNum+ baseQty - _ChannelList.BaseQuantity;
//_ChannelList.channelStocks[0].NeedNum = _ChannelList.channelStocks[0].NeedNum + baseQty - _ChannelList.BaseQuantity;
}
else
{
_ChannelList.channelStocks[0].NeedNum = 0;
//_ChannelList.channelStocks[0].NeedNum = 0;
_ChannelList.channelStocks.ForEach(cs => cs.State = 0);
SqlSugarHelper.Db.Updateable(_ChannelList.channelStocks).UpdateColumns(cs => new { cs.State }).ExecuteCommand();
}
int oldBaseQty = _ChannelList.BaseQuantity;
_ChannelList.BaseQuantity = baseQty;
@ -468,10 +470,10 @@ namespace DM_Weight.ViewModels
//int iUpdate = SqlSugarHelper.Db.Updateable<ChannelStock>(_ChannelList.channelStocks[0]).ExecuteCommand();
_ChannelList.channelStocks.ForEach(cs => cs.BaseQuantity = baseQty);
int iBaseUpdate = SqlSugarHelper.Db.Updateable<ChannelStock>().SetColumns(cs => new ChannelStock(){ BaseQuantity= _ChannelList.channelStocks[0].BaseQuantity }).Where(cs=>cs.Chnguid==_ChannelList.Id).ExecuteCommand();
if (iBaseUpdate > 0)
{
iBaseUpdate = SqlSugarHelper.Db.Updateable(_ChannelList.channelStocks[0]).UpdateColumns(cs => new { cs.NeedNum }).ExecuteCommand();
}
//if (iBaseUpdate > 0)
//{
// iBaseUpdate = SqlSugarHelper.Db.Updateable(_ChannelList.channelStocks[0]).UpdateColumns(cs => new { cs.NeedNum }).ExecuteCommand();
//}
//更新ChannelList表中的BaseQuantity
int iUpdateChannelList = SqlSugarHelper.Db.Updateable<ChannelList>()
.SetColumns(it => new ChannelList() { BaseQuantity = baseQty })

View File

@ -626,12 +626,13 @@ namespace DM_Weight.ViewModels
ManuNo = cs.ManuNo,
EffDate = cs.EffDate,
YQuantity = 0,
ManuStock = oi._OrderDetail.Quantity,
ManuStock =nowChannels.Sum(it => it.Quantity), //oi._OrderDetail.Quantity,
TotalStock = oi._OrderDetail.Quantity,
UserId1 = HomeWindowViewModel.Operator?.Id,
UserId2 = HomeWindowViewModel.Reviewer?.Id,
MachineId = ConfigurationManager.AppSettings["dm_machineId"].ToString(),
CreateDate = DateTime.Now.ToString("yyyy-MM-dd"),
CreateTime=DateTime.Now,
InvoiceNo = "日结存"
}).ExecuteCommand();
if (iDayResult <= 0)
@ -664,6 +665,7 @@ namespace DM_Weight.ViewModels
UserId2 = HomeWindowViewModel.Reviewer?.Id,
MachineId = ConfigurationManager.AppSettings["dm_machineId"].ToString(),
CreateDate = DateTime.Now.ToString("yyyy-MM-dd"),
CreateTime = DateTime.Now,
InvoiceNo = "总结存"
}).ExecuteCommand();
if (iTotalResult <= 0)
@ -748,7 +750,7 @@ namespace DM_Weight.ViewModels
machineRecord.Operator = HomeWindowViewModel.Operator?.Id;
machineRecord.OperationTime = DateTime.Now;
machineRecord.Type = 55;
machineRecord.InvoiceId = $"打开{DrawerNo + 1}号手术间";
machineRecord.InvoiceId = $"管理员核对单,打开{DrawerNo + 1}号手术间";
if (DrawerNo >= 0)

View File

@ -783,7 +783,7 @@ namespace DM_Weight.ViewModels
machineRecord.Operator = HomeWindowViewModel.Operator?.Id;
machineRecord.OperationTime = DateTime.Now;
machineRecord.Type = 55;
machineRecord.InvoiceId = $"打开{DrawerNo}号手术间";
machineRecord.InvoiceId = $"麻醉师核对单,打开{DrawerNo}号手术间";
if (DrawerNo > 0)
@ -1059,12 +1059,12 @@ namespace DM_Weight.ViewModels
if (oi.DmStatus == 0)
{
//查询该药箱是否有该批次的药品,没有则无法确认(避免管理进行确认时确认不过去)
if(oi.OrderDetailList!=null)
if(oi._OrderDetail != null)
{
for (int j = 0; j < oi.OrderDetailList.Count; j++)
{
oi._OrderDetail = oi.OrderDetailList[j];
int drawerNo = DrawerNo + 1;
//for (int j = 0; j < oi.OrderDetailList.Count; j++)
//{
// oi._OrderDetail = oi.OrderDetailList[j];
int drawerNo = DrawerNo;
ChannelStock cs = SqlSugarHelper.Db.Queryable<ChannelStock>()
.Where(cs => cs.DrugId == oi._OrderDetail.DrugId
&& cs.ManuNo == oi._OrderDetail.SetManuNo
@ -1080,7 +1080,7 @@ namespace DM_Weight.ViewModels
_eventAggregator.GetEvent<SnackbarEvent>().Publish(alertMsg);
return false;
}
}
//}
}

View File

@ -180,7 +180,7 @@ namespace DM_Weight.ViewModels
machineRecord.Operator = HomeWindowViewModel.Operator?.Id;
machineRecord.OperationTime = DateTime.Now;
machineRecord.Type = 55;
machineRecord.InvoiceId = $"打开{Convert.ToInt32(SelectedItem.Code)}号手术间";
machineRecord.InvoiceId = $"交换药品明细{_ChannelStock?.DrawerNo}打开{Convert.ToInt32(SelectedItem.Code)}号手术间";
if (Convert.ToInt32(SelectedItem.Code) > 0)

View File

@ -76,10 +76,10 @@ namespace DM_Weight.ViewModels
machineRecord.Operator = HomeWindowViewModel.Operator?.Id;
machineRecord.OperationTime = DateTime.Now;
machineRecord.Type = 55;
machineRecord.InvoiceId = $"打开{DrawerNo+1}号手术间";
machineRecord.InvoiceId = $"交换药品,打开{DrawerNo+1}号手术间";
if (DrawerNo > 0)
if (DrawerNo+1 > 0)
{
RequestData();
_socketHelper.speechSynthesizer.SpeakAsyncCancelAll();

View File

@ -12,7 +12,6 @@ using Prism.Commands;
using Prism.Events;
using Prism.Mvvm;
using Prism.Regions;
using ScreenRecorderLib;
using System;
using System.Collections.Generic;
using System.IO;
@ -29,10 +28,10 @@ namespace DM_Weight.ViewModels
{
#region
public Recorder _recorder;
//public Recorder _recorder;
private string _outputFolder;
private string _outputFilePath;
public static MainWindowViewModel vm;
//public static MainWindowViewModel vm;
#endregion
private string _title = "Prism App"; //标题
@ -82,9 +81,10 @@ namespace DM_Weight.ViewModels
SocketHelper _socketHelper;
private PortUtil _portUtil;
public MainWindowViewModel(IRegionManager regionManager, IUnityContainer container, IEventAggregator eventAggregator, FingerprintUtil fingerprintUtil, SocketHelper socketHelper, PortUtil portUtil)
FFmpegHelper fmpegHelper;
public MainWindowViewModel(IRegionManager regionManager, IUnityContainer container, IEventAggregator eventAggregator, FingerprintUtil fingerprintUtil, SocketHelper socketHelper, PortUtil portUtil,FFmpegHelper fmpegHelper)
{
vm = this;
//vm = this;
_portUtil = portUtil;
this.eventAggregator = eventAggregator;
this.eventAggregator.GetEvent<SnackbarEvent>().Subscribe(doMyPrismEvent2);
@ -137,6 +137,7 @@ namespace DM_Weight.ViewModels
next();
}
});
this.fmpegHelper= fmpegHelper;
}
void doMyPrismEvent2(AlertMsg msg)
@ -196,21 +197,21 @@ namespace DM_Weight.ViewModels
}
else if (type == 2)
{
_recorder?.Dispose();
//_recorder?.Dispose();
}
}
#endregion
void StopPrintScreen()
{
fmpegHelper.stopFlag = true;
fmpegHelper.StopRecording();
//退出登录结束录屏
_recorder?.Stop();
//_recorder?.Stop();
}
//录屏
void StartPrintScreen()
{
// 创建输出目录
fmpegHelper.stopFlag = false;
_outputFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "Log", "ScreenRecordings");
if (!Directory.Exists(_outputFolder))
{
@ -218,30 +219,40 @@ namespace DM_Weight.ViewModels
}
// 生成输出文件名
string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
_outputFilePath = Path.Combine(_outputFolder, $"{timestamp}.mp4");
_outputFilePath = Path.Combine(_outputFolder, $"{timestamp}.webm");
fmpegHelper.StartRecording(_outputFilePath, 25);
//// 创建输出目录
//_outputFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "Log", "ScreenRecordings");
//if (!Directory.Exists(_outputFolder))
//{
// Directory.CreateDirectory(_outputFolder);
//}
//// 生成输出文件名
//string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
//_outputFilePath = Path.Combine(_outputFolder, $"{timestamp}.mp4");
// 设置录制选项
var options = new RecorderOptions();
//// 设置录制选项
//var options = new RecorderOptions();
// 创建录制器实例
_recorder = Recorder.CreateRecorder(options);
//// 创建录制器实例
//_recorder = Recorder.CreateRecorder(options);
// 设置事件处理
_recorder.OnRecordingComplete += Recorder_OnRecordingComplete;
_recorder.OnRecordingFailed += Recorder_OnRecordingFailed;
//// 设置事件处理
//_recorder.OnRecordingComplete += Recorder_OnRecordingComplete;
//_recorder.OnRecordingFailed += Recorder_OnRecordingFailed;
// 开始录制
_recorder.Record(_outputFilePath);
//// 开始录制
//_recorder.Record(_outputFilePath);
}
//录制失败
private void Recorder_OnRecordingFailed(object sender, RecordingFailedEventArgs e)
{
logger.Info($"录制失败: {e.Error}");
}
//录制完成
private void Recorder_OnRecordingComplete(object sender, RecordingCompleteEventArgs e)
{
logger.Info($"录制完成: {e.FilePath}");
}
//private void Recorder_OnRecordingFailed(object sender, RecordingFailedEventArgs e)
//{
// logger.Info($"录制失败: {e.Error}");
//}
////录制完成
//private void Recorder_OnRecordingComplete(object sender, RecordingCompleteEventArgs e)
//{
// logger.Info($"录制完成: {e.FilePath}");
//}
}
}

View File

@ -182,7 +182,7 @@ namespace DM_Weight.ViewModels
machineRecord.Operator = HomeWindowViewModel.Operator?.Id;
machineRecord.OperationTime = DateTime.Now;
machineRecord.Type = 55;
machineRecord.InvoiceId = $"打开{Convert.ToInt32(SelectedItem.Code)}号手术间";
machineRecord.InvoiceId = $"移出药品{_ChannelStock?.DrawerNo}打开{Convert.ToInt32(SelectedItem.Code)}号手术间";
if (Convert.ToInt32(SelectedItem.Code) > 0)

View File

@ -226,7 +226,7 @@ namespace DM_Weight.ViewModels
Operator = HomeWindowViewModel.Operator?.Id,
OperationTime = DateTime.Now,
Type = 55,
InvoiceId = $"打开{DrawerNo}号手术间",
InvoiceId = $"设置药箱,打开{DrawerNo}号手术间",
}).ExecuteCommand();
//bool bFlag = ModbusHelper.GetInstance().OpenBoxDoor(DrawerNo - 1);
_socketHelper.SendMessage(new MyBaseMessage() { lockNo = (short)(DrawerNo - 1) });

View File

@ -112,8 +112,8 @@
<Grid Margin="0 6 0 6" Grid.Row="0" Grid.ColumnSpan="2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="3*" />
<ColumnDefinition Width="4*" />
<ColumnDefinition Width="2*" />
<ColumnDefinition Width="3*" />
<ColumnDefinition Width="3*" />
</Grid.ColumnDefinitions>
<DatePicker
Grid.Column="0"
@ -123,7 +123,7 @@
materialDesign:HintAssist.Hint="开单日期"
Style="{StaticResource MaterialDesignOutlinedDatePicker}" />
<StackPanel Grid.Column="2" Orientation="Horizontal" HorizontalAlignment="Right">
<StackPanel Grid.Column="1" Grid.ColumnSpan="2" Orientation="Horizontal" HorizontalAlignment="Right">
<!--<Button Margin="0 0 6 0" Content="{Binding SelfContent}" Command="{Binding OpenBoxDelegate}" CommandParameter="0" Visibility="Collapsed"
IsEnabled="{Binding SelfEnable}"

View File

@ -109,7 +109,7 @@
<Grid Grid.Column="1" Margin="6">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="550" />
</Grid.RowDefinitions>
<StackPanel HorizontalAlignment="Right" Orientation="Horizontal" Grid.ColumnSpan="2">
<Button Margin="6 0 6 6"

View File

@ -100,7 +100,7 @@
<Grid Grid.Column="1" Margin="6">
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="550" />
</Grid.RowDefinitions>
<StackPanel HorizontalAlignment="Right" Orientation="Horizontal" Grid.ColumnSpan="2">
<Button Margin="6 0 6 6"

View File

@ -28,7 +28,7 @@
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
<RowDefinition Height="550" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid Margin="0 6 0 6" Grid.Row="0">

View File

@ -32,12 +32,12 @@ namespace DM_Weight.Views
{
//IRegionManager _regionManager;
//IUnityContainer _container;
MainWindowViewModel vms;
//MainWindowViewModel vms;
private readonly ILog logger = LogManager.GetLogger(typeof(PortUtil));
public MainWindow()
{
InitializeComponent();
vms = MainWindowViewModel.vm;
//vms = MainWindowViewModel.vm;
//_regionManager = regionManager;
//_container = container;
//System.Windows.Application.Current.Dispatcher.BeginInvoke(System.Windows.Threading.DispatcherPriority.Send, new Action(() =>
@ -49,10 +49,10 @@ namespace DM_Weight.Views
//}));
}
protected override void OnClosed(EventArgs e)
{
vms._recorder?.Dispose();
base.OnClosed(e);
}
//protected override void OnClosed(EventArgs e)
//{
// vms._recorder?.Dispose();
// base.OnClosed(e);
//}
}
}

View File

@ -28,7 +28,7 @@
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition />
<RowDefinition Height="550"/>
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid Margin="0 6 0 6" Grid.Row="0">

View File

@ -0,0 +1,79 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
namespace DM_Weight.util
{
public class FFmpegHelper
{
private Process _ffmpegProcess;
private string _ffmpegPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "ffmpeg.exe");
//是否停止录屏标志
public bool stopFlag = false;
public void StartRecording(string outputPath, int frameRate = 30)
{
//int width = (int)SystemParameters.PrimaryScreenWidth;
//int height = (int)SystemParameters.PrimaryScreenHeight;
//string args = $"-f gdigrab -framerate 30 -i desktop -c:v libx264 -crf 25 -preset ultrafast -t {segmentDuration} {segmentPath}";
int segmentDuration = 1800; // 每段半小时
string args = $"-f gdigrab -framerate {frameRate} " +
$"-i desktop -preset ultrafast -t {segmentDuration} {outputPath}";
_ffmpegProcess = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = _ffmpegPath,
Arguments = args,
UseShellExecute = false,
CreateNoWindow = true,
RedirectStandardInput = true
}
};
_ffmpegProcess.Start();
ThreadPool.QueueUserWorkItem(CheckFFmpegProcess); // 检查FFmpeg进程是否完成以开始下一个录制段
}
public void StopRecording()
{
_ffmpegProcess?.StandardInput.WriteLine("q");
_ffmpegProcess?.WaitForExit(1000);
_ffmpegProcess?.Close();
}
private void CheckFFmpegProcess(object state)
{
try
{
if (!stopFlag)
{
_ffmpegProcess.WaitForExit(); // 等待FFmpeg进程结束
if (!_ffmpegProcess.HasExited) return; // 如果进程未结束,则不继续
// 开始下一个录制段,如果需要循环录制,可以取消注释下面的代码行并适当调整逻辑
// StartRecording(); // 注意:这将无限循环录制,可能需要用户界面干预来停止或重置计数器。
string _outputFolder;
string _outputFilePath;
_outputFolder = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "Log", "ScreenRecordings");
if (!Directory.Exists(_outputFolder))
{
Directory.CreateDirectory(_outputFolder);
}
// 生成输出文件名
string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
_outputFilePath = Path.Combine(_outputFolder, $"{timestamp}.webm");
StartRecording(_outputFilePath, 25);
}
}
catch (Exception ex)
{
}
}
}
}