using RichCreator.Utility;
using RichCreator.Utility.Captures;
using RichCreator.Utility.CV;
using RichCreator.Utility.InputControl;
using RichCreator.Utility.Structs;
using RichCreator.Utility.Utilitys;
using Emgu.CV;
using Emgu.CV.Structure;
using RichCreator.Models;
using RichCreator.ViewModels;
using System;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using ZTImage.Configuration;
using ZTImage.Log;
namespace RichCreator
{
///
/// MainWindow.xaml 的交互逻辑
///
public partial class MainWindow : Window
{
private ConfigViewModel viewModel;
public MainWindow()
{
InitializeComponent();
G.Instance.EnableWriter(this.writeDebug, this.writeInfo, this.writeRemainTime, this.CancelConfirm,this.stopTaskUI);
viewModel = new ConfigViewModel();
this.DataContext = viewModel;
}
private JobMonitor monitor;
private bool isRunning = false;
#region events
///
/// 开始运行
///
///
///
private void Run_Click(object sender, RoutedEventArgs e)
{
Int32 taskIndex = this.taskName.SelectedIndex;
if (isRunning)
{
monitor.Stop();
stopTaskUI();
return;
}
G.Instance.DebugWriter("开始运行,2秒后开始控制,请不要移动鼠标!~");
RunningButton.IsEnabled = false;
Task.Run(() => {
Thread.Sleep(2000);
if (!TestHardware())
{
if (!TestHardware())
{
G.Instance.DebugWriter("检测硬件未通过");
stopTaskUI();
return;
}
}
G.Instance.DebugWriter("硬件检测通过");
this.monitor = new JobMonitor(taskIndex);
monitor.Start();
startTaskUI();
});
}
///
/// 清空日志
///
///
///
private void ClearLog_Click(object sender, RoutedEventArgs e)
{
this.LogTB.Text = string.Empty;
}
///
/// 点击检测按钮
///
///
///
private void BtnTestDo_Click(object sender, RoutedEventArgs e)
{
if (this.RemainTimeTB.Text.Trim() == "032j")
{
testTempVar = true;
}
else
{
testTempVar = false;
}
manualre.Set();
}
///
/// 取消重试
///
///
///
private void CancelTry_Click(object sender, RoutedEventArgs e)
{
cancelReTry = true;
}
///
/// GPD路径浏览
///
///
///
private void BrowserGPDPath_Click(object sender, RoutedEventArgs e)
{
string exePath = string.Empty;
Microsoft.Win32.OpenFileDialog ofd = new Microsoft.Win32.OpenFileDialog();
ofd.DefaultExt = ".exe";
ofd.Filter = "tgp_daemon|*.exe";
ofd.Multiselect = false;
if (ofd.ShowDialog() == true)
{
exePath = ofd.FileName;
}
else
{
return;
}
if (File.Exists(exePath))
{
this.viewModel.TGPDaemonPath = exePath;
return;
}
}
///
/// 保存配置
///
///
///
private void ConfigSave_Click(object sender, RoutedEventArgs e)
{
this.viewModel.SaveConfig();
MessageBox.Show("配置更新成功");
}
#endregion
private ZTPoint GetRolePosition()
{
System.Drawing.Bitmap bitmap = ScreenCapture.Instance.CaptureScreen();
//原图
Image image = new Image(bitmap);
//色彩hsv
Image hsvImage = new Image(image.Width, image.Height);
CvInvoke.CvtColor(image, hsvImage, Emgu.CV.CvEnum.ColorConversion.Rgb2Hsv);
hsvImage = hsvImage.GetSubRect(new System.Drawing.Rectangle(0, 0, 1280, 720));
return DnfCVHelper.FindRole(hsvImage, new ZTRectangle(0, 0, 1280, 720));
}
#region 测试硬件
//测试硬件的中间变量
private bool testTempVar = false;
private AutoResetEvent manualre = new AutoResetEvent(false);
///
/// 测试硬件是否正常工作
///
///
private bool TestHardware()
{
testTempVar = false;
ZTPoint btnPosition = ZTPoint.Empty;
ZTPoint txtPosition = ZTPoint.Empty;
using (ManualResetEvent mre = new ManualResetEvent(false))
{
//等待读取位置成功
this.Dispatcher.BeginInvoke((Action)(() =>
{
this.RemainTimeTB.Text = string.Empty;
btnPosition = GetElementClickPosition(this.btnTestDo);
txtPosition = GetElementClickPosition(this.RemainTimeTB);
mre.Set();
}));
if (!mre.WaitOne(1000))
{
return false;
}
}
//输入文字
G.Instance.InputControl.MoveToAndClick(txtPosition);
G.Instance.InputControl.InputString("032j");
//点检测
G.Instance.InputControl.MoveToAndClick(btnPosition);
bool rtt = manualre.WaitOne(8000);
if (!rtt)
{
return false;
}
if (testTempVar)
{
return true;
}
return false;
}
///
/// 获取控件位置
///
///
///
private ZTPoint GetElementClickPosition(Control element)
{
Point t = element.PointToScreen(new Point(0, 0));
ZTPoint t1 = new ZTPoint((Int32)(t.X + element.ActualWidth / 2), (Int32)(t.Y + element.ActualHeight / 2));
return t1;
}
#endregion
#region 显示
///
/// 输出调试信息
///
///
private void writeDebug(string msg)
{
this.Dispatcher.BeginInvoke((Action)(() =>
{
string content = DateTime.Now.ToString("dd日HH:mm:ss") + "->" + msg;
this.debugMessage.Text = content;
}));
Trace.Debug(msg);
}
///
/// 输出关键信息
///
///
private void writeInfo(string msg)
{
this.Dispatcher.BeginInvoke((Action)(() =>
{
if (string.IsNullOrEmpty(msg))
{
this.LogTB.Text = string.Empty;
return;
}
string content = DateTime.Now.ToString("dd日HH:mm:ss") + "->" + msg + "\r\n";
this.LogTB.AppendText(content);
this.LogTB.ScrollToEnd();
}));
Trace.Info(msg);
}
bool cancelReTry = false;
///
/// 弹出提示,并带有倒计时
///
///
///
private bool CancelConfirm(Int64 remainMillSecond)
{
bool retry = true;
ManualResetEvent mre = new ManualResetEvent(false);
//启用取消按钮
this.Dispatcher.BeginInvoke((Action)(() =>
{
cancelReTry = false;
btnCancelTry.IsEnabled = true;
mre.Set();
}));
mre.WaitOne();
mre.Reset();
//计时,并判断是否取消
for (int remainSecond = (Int32)remainMillSecond / 1000; remainSecond >= 0; remainSecond--)
{
this.Dispatcher.BeginInvoke((Action)(() =>
{
btnCancelTry.Content = "取消重试(" + remainSecond + ")";
mre.Set();
}));
mre.WaitOne();
mre.Reset();
if (cancelReTry)
{
//取消重试
retry = false;
break;
}
Thread.Sleep(1000);
}
//禁用取消按钮
this.Dispatcher.BeginInvoke((Action)(() =>
{
cancelReTry = false;
btnCancelTry.IsEnabled = false;
btnCancelTry.Content = "取消重试";
mre.Set();
}));
mre.WaitOne();
mre.Reset();
mre.Close();
return retry;
}
///
/// 输出剩余时间
///
///
private void writeRemainTime(Int64 remaintime)
{
//更新倒计时
string rt = "--:--";
if (remaintime >= 0)
{
Int64 min = remaintime / 60;
Int64 sec = remaintime % 60;
rt = min.ToString().PadLeft(2, '0') + ":" + sec.ToString().PadLeft(2, '0');
}
this.Dispatcher.BeginInvoke((Action)(() =>
{
this.RemainTimeTB.Text = rt;
}));
}
///
/// 开始任务UI设置
///
private void startTaskUI()
{
//文字设成停止运行
this.Dispatcher.BeginInvoke((Action)(() => {
RunningButton.Content = "停止";
RunningButton.IsEnabled = true;
isRunning = true;
}));
}
///
/// 停止任务
///
private void stopTaskUI()
{
//文字设成停止运行
this.Dispatcher.BeginInvoke((Action)(() => {
RunningButton.Content = "开始";
RunningButton.IsEnabled = true;
isRunning = false;
}));
}
#endregion
}
}